浅谈Java的 int 和 Integer 的区别

1.基础概念:

int是我们常说的整型数字,是Java的8个原始数据类型之一。Java语言虽然号称一切都是对象,但原始数据类型是例外。


Integer是int对应的包装类,它有一个int类型的字段存储数据,并且提供了基本操作,比如数学运算、int和字符串之间转换等。在Java 5中,引入了自动装箱和自动拆箱功能(boxing/unboxing),Java可以根据上下文,自动进行转换,极大地简化了相关编程。


注:自动装箱与拆箱实际上算是一种“语法糖”。所谓语法糖,可简单理解为Java平台为我们自动进行了一些转换,保证不同的写法在运行时等价。因此它们是发生在编译阶段的,也就是说生成的字节码是一致的。

2.主要区别:

Integer是int的包装类,现在最新的J,int则是java的一种基本数据类型.


Integer变量必须实例化后才能使用,而int变量不需要.


Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值.


Integer的默认值是null,int的默认值是0.

3.应用中的一些特性:

a.由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。

Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i == j); //false

b.但如果是int 和 interger对比的话,系统会默认我们对比的是值而非内存地址:

Integer i = new Integer(100);
int j = 100;
System.out.print(i == j); //true

c. new Integer(100)生成的变量指向堆中新建的对象,而直接声明的指向的是java常量池中的对象,所以指向的地址不同(同为interger就对比地址而非指,因为interger属于类(包装类)

Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); //false

 d.对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false

Integer i = 100;
Integer j = 100;
System.out.print(i == j); //true
Integer i = 128;
Integer j = 128;
System.out.print(i == j); //false

这是因为 Java对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了。

所以说因为128不会被缓存而是直接新建的对象,所以说存储的地址是不同的。

引用:

https://blog.csdn.net/zjfahs/article/details/90138277

https://blog.csdn.net/weixin_39793752/article/details/80951220

原文地址:https://www.cnblogs.com/cptCarlvon/p/12672081.html