你知道在Java中Integer和int的这些区别吗?
作者:程序届的伪精英 发布时间:2023-09-04 02:50:18
一、基本概念(重要)
Integer 是 int 的包装类,int 则是 java 的一种基本数据类型;
Integer 变量必须实例化后才能使用,而int变量不需要;
Integer 实际是对象的引用,当new一个 Integer时,实际上是生成一个指针指向此对象;而 int 则是直接存储数据值;
Integer的默认值是null,int的默认值是0。
二、拓展
基于以上的一些概念,这里我们拓展一下,对于Integer包装类型与int基本数据类型之间数值相互比较的结果进行一下说明,这个也可能在面试当中会被问到。
三、new Integer()与new Integer()的比较
下面的代码大家觉得结果是什么呢?大家可以先自己想一想然后再继续往下看。
public static boolean comp(){
Integer i1=new Integer(10);
Integer i2=new Integer(10);
return i1==i2;
}
Integer 变量必须实例化后才能使用,也就是我们必须new Integer()之后才可以使用,而我们知道,任何对象只要是new出来的都会放在堆内存中,同时该变量存储指向堆内存的地址,只要new出来的对象就是一个新对象,也就是说i1和i2指向的两个不同的对象,为了证明这一点,我们通过javap -v 看一下字节码,也能看的很清楚。
因为是两个不同的对象,所以上面的结果是false。
四、Integer与new Integer()的比较
再看下面的代码,Integer变量 和 new Integer() 变量比较
public static boolean comp1(){
Integer i1=new Integer(10);
Integer i2=10;
return i1==i2;
}
因为 Integer变量 指向的是 java 常量池中的对象,而 new Integer() 的变量指向堆中新建的对象,两者在内存中的地址不同,两者比较的话永远为 false。
五、Integer与Integer的比较
public static void comp2(){
Integer i = 100;
Integer j = 100;
System.out.print(i == j);
Integer m = 128;
Integer n = 128;
System.out.print(m == n);
}
这里为什么会列举两个呢?大家往下看。
其实Integer i = 100 在编译时,会翻译成为 Integer i = Integer.valueOf(100),而 java 对 Integer类型的 valueOf 的定义如下:
这里的low和high分别为-128和127。
阅读源码我们可以很清晰的看到,java对于-128到127之间的数,会进行缓存,所以 当Integer i 的值在 -128到127之间时,会将值进行缓存,下次再取Integer j(值在 -128到127之间)时,就会直接从缓存中取,就不会new了,这样拿到的就是同一个对象。当Integer i 的值不在 -128到127之间时,每次都会重新new Integer(),那么每次都会是不同的对象。所以看到这里,大家应该知道上面的两个不同的比较的结果是什么了把,前者为true,后者为false。
六、int 变量 与 Integer、 new Integer() 比较
int 变量 与 Integer、 new Integer() 比较时,只要两个的值是相等,则为true,需要说明的是包装类Integer 和 基本数据类型int 比较时,java会自动拆包装为int ,然后进行比较,实际上就变为两个int变量的比较。
Integer i = new Integer(10); //自动拆箱为 int i=10; 此时,相当于两个int的比较
int j = 10;
System.out.print(i == j); //true
看完了以上的,大家看看下面的比较大家能否写出正确的结果。
public static void comp3(){
int i = 128;
Integer i2 = 128;
Integer i3 = new Integer(128);
System.out.println("i == i2 = " + (i == i2)); // Integer会自动拆箱为int,所以为true
System.out.println("i == i3 = " + (i == i3)); // true,理由同上
Integer i4 = 127;// 编译时被翻译成:Integer i4 = Integer.valueOf(127);
Integer i5 = 127;
System.out.println("i4 == i5 = " + (i4 == i5));// true
Integer i6 = 128;
Integer i7 = 128;
System.out.println("i6 == i7 = " + (i6 == i7));// false
Integer i8 = new Integer(127);
System.out.println("i5 == i8 = " + (i5 == i8)); // false
Integer i9 = new Integer(128);
Integer i10 = new Integer(128);
System.out.println("i9 == i10 = " + (i9 == i10)); // false
}
public static void comp4(){
Integer a = new Integer(127), b = new Integer(128);
int c = 127, d = 128, dd = 128;
Integer e = 127, ee = 127, f = 128, ff = 128;
System.out.println(a == b); // false 因为a,b都是new出来的对象,地址不同所以为false
System.out.println(a == c); // true a会自动拆箱为int类型
System.out.println(a == e); // false 指向的地址不同a是new出来的
System.out.println(e == c); // true e会自动拆箱为int类型
System.out.println(e == ee);// true Integer对 处于-128到127范围之间,指向了同一片地址区域
System.out.println(b == f); // false 指向的地址不同b是new出来的
System.out.println(f == d); // true f自动拆箱为int类型
System.out.println(f == ff); /*
* false 指向的不是同一片地址区域。
* 在Integer类型中,-128到127存放的是同一片区域地址,
* 之外的数是另外开辟空间来进行 存储的
*/
System.out.println(d == dd); // true 不解释
}
public static void comp5(){
Integer i01 = 59;
int i02 = 59;
Integer i03 =Integer.valueOf(59);
Integer i04 = new Integer(59);
System.out.println(i01 == i02);//true
System.out.println(i01 == i03);//true
System.out.println(i03 == i04);//false
System.out.println(i02 == i04);//true
}
public static void comp6(){
Integer i01 = 128;
int i02 = 128;
Integer i03 = Integer.valueOf(128);
Integer i04 = new Integer(128);
System.out.println(i01 == i02);//true
System.out.println(i01 == i03);//false
System.out.println(i03 == i04);//false
System.out.println(i02 == i04);//true
}
来源:https://blog.csdn.net/weixin_43525722/article/details/117666508


猜你喜欢
- 简介Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效
- 前言Quarkus和RESTEasy团队非常高兴地宣布了Quarkus中的RESTEasy Reactive集成已进入master分支,并将
- Java接口回调产生接口回调的场景在现实生活中,产生接口回调的场景很简单,比如我主动叫你帮我做一件事,然后你做完这件事之后会通知我,&quo
- Integer获取第一位和最后一位并截取场景获取 5,10,15,25,30; 判断尾数为5的进入判断public static void
- 开发Android程序时,有时候在程序运行的时候,不能让系统休眠,否则有一些运行会停止,因此我们需要设置禁止休眠,有两种方式: &
- 文件下载是一个软件开发中的常见需求。本文从最简单的下载方式开始步步递进,讲述了文件下载过程中的常见问题并给出了解决方案。并展示了如何使用多线
- 本文实例为大家分享了Android sharedPreferences实现记住密码功能,供大家参考,具体内容如下编写界面交互代码:packa
- 本文实例为大家分享了java * 实现在线人数统计的具体代码,供大家参考,具体内容如下1.在工程中创建监听类SessionListener
- 一、日志1、配置日志级别日志记录器(Logger)的行为是分等级的。如下表所示:分为:OFF、FATAL、ERROR、WARN、INFO、D
- 无论是Android开发或者是其他移动平台的开发,ListView肯定是一个大咖,那么对ListView的操作肯定是不会少的,上一篇博客介绍
- C#实现的获取路由器MAC地址,路由器外网地址。对于要获取路由器MAC地址,一定需要知道路由器web管理系统的用户名和密码。至于获取路由器的
- 为Repository添加自定义方法一、为某个Repository添加自定义方法1、定义一个接口PersonDao,声明要添加的方法。pub
- 接着上篇文章,我们继续来学习 Java 中的字节流操作。装饰者缓冲流 BufferedInput/OutputStream装饰者流其实是基于
- 导语:有些时候我们所需要查询的数据量比较大,但是jvm内存又是有限制的,数据量过大会导致内存溢出。这个时候就可以使用流式查询,数据一条条的返
- 前言前面我们已经实现了服务的注册与发现(请戳:SpringCloud系列——Eureka 服务注册与发现),并且在注册中心注册了一个服务my
- 文件上传的方法主要目前有两个常用的,一个是SmartUpload,一个是Apache的Commons fileupload.我们这里主要介绍
- 本文实例为大家分享了springMVC实现文件上传和下载的具体代码,供大家参考,具体内容如下1准备工作web.xml文件导入Dispatch
- 前言在SpringIOC中,我们熟知的BeanScope有单例(singleton)、原型(prototype), Bean的Scope影响
- 前言这个东西有啥用,好玩?确实, 好玩归好玩,其实很有使用场景。可以自己选则一些业务节点触发这个机器人助手的消息推送;简单举例:1. 有人给
- 这篇文章主要介绍了Spring Cloud Hystrix异常处理方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参