Integer的缓存机制问题:
Integer是对小数据(-128127)是有缓存的,在jvm初始化的时候,数据-128127之间的数字便被缓存到了本地内存中,这样,如果初始化-128~127之间的数字,便会直接从内存中取出,而不需要再新建一个对象。
使用缓存时对象的初始化方式仅限于下面这两种:
Integer a=100;
Integer b=Integer.valueOf(100);
所以,100这个数字再-128~127之间,那么a和b实际上是引用的是一个内存地址,那么a==b自然就是true了。
Integer a1=128;
Integer b1=Integer.valueOf(128);
128不在-128~127之间了,所以会使用new新建个对象,那么a1和b1的内存地址就不一样了,a1==b1的结果就是false.
如果使用另一种初始化方式便不会使用缓存:
Integer c=new Integer(100);
使用new初始化对象会申请新的内存地址,所以a==c就是false。
如果是Integer对象之间比较,则比较的是两个对象的地址,如果是两个int比较则是比较基础数据类型的值,如果是Integer和int比较则Integer将会被自动拆箱,最终变为基本数据类型的比较。如:
int d=100;
则a == d;a == c;都为true;
int e=128;
则a1 == e;b1 == e;都为true;