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.