java中Int和Integer的比较

时间:2025-03-10 17:37:12

       Java学习如盖楼一样,必须打稳地基。在面试中许多你觉得简单的问题往往成了你的绊脚石,我在这里总结了一下基本数据类型Int和包装类型Integer,希望各位大神看到有什么不对的地方,及时指出,小生先谢过各位修炼多年的前辈了。

 

Java 有两大数据类型:

内置数据类型:8大基本类型,我就不一一列举了。

引用数据类型:除了8大基本类型,其它都是引用类型了。

int 数据类型是4个字节,32位、有符号的以二进制补码表示的整数;

最小值是 -2,147,483,648(-2^31);

最大值是 2,147,483,647(2^31 - 1);

一般地整型变量默认为 int 类型;

默认值是 0 ; int的变量名和数值都存储在栈内存中,且栈内存中的数据可以共享。

例子:int a = 10, int b = -10。

integer是int的封装类(包装类),还包含了很多与数据有关的方法,integer是引用堆内存的一个对象,变量名在栈内存

变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。

内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。

因此,通过定义不同类型的变量,可以在内存中储存整数、小数或者字符。

 

接下来对int型数据和Integer数据进行比较。

用==和equals比较,==是进行地址及值比较,无法对==操作符进行重载,而对于equals方法,Integer里面的equals方法重写了Object的equals方法,查看Integer源码可以看出equals方法进行的是数值比较。

Int a=10;               int c=200;

Integer b=10;       Integer d=200;

a==b?                   c==d?

(b)?        (d)?

包装类Integer和基本数据类型int比较的时候,java会自动拆包装类为int,然后进行比较,所以

所以a==b,true. (b),true.

直接赋值的Integer对象,其值存储在常量池,b和d指向的是常量池中的对象,进行比较时,如果两个变量的值在-128~127之间,结果为true。如果两个变量不在此区间,比较结果为false。

原因是Integer实现的时候 对于-128 到127之间的值会做缓存处理,Java里面对处在在-128~127之间的Integer值,用的是原生数据类型int,会在内存里供重用,也就是说这之间的Integer值进行==比较时只是进行int原生数据类型的数值比

比如Integer d=10,a=10 那么a和b就直接比较数值了,因为常量池中b有缓存。而超出-128 到127这个范围,就不会缓存,而是新建一个对象。

所以 c==d,false, (d),true.

 

Integer e= new Integer(10);

Integer f=new Integer(10);

e==f?

(f)?

E和f是new 出来的两个不同的对象地址不同,所以e==f?false,equals只比较数据中所以(f)?true.