128陷阱的表现:
Integer a=128;
Integer b=128;
a==b; //false
a.equals(b); //true
在一般情况下,使用==即可比较两个对象的值是否相等。当对象的值不在-128到127的范围内,发现使用==的比较结果“不正确”。如图,a==b返回false。
产生原因:
==是对内存地址的比较,内存地址相同为true;equals()是对值和内容的比较,内容相同为true。
开辟新空间会占用大量的资源,在-128到127之间的Integer类型的变量,一般认为这个范围的数比较常用,已经事先开辟好了这些数的空间。使用时直接指向常量池中的缓存地址,而不会开辟出新的空间。
所以,当两个比较的对象在 -128到127 的范围内,只要值相同,两个对象的地址就相同。超出这个范围内,方法会开辟新的空间,此时两个数的内存地址不相同。
对上述a和b相互比较的情况,如果用==进行比较,因为内存地址不同判断false。如果用equals方法进行比较,值相同,则会返回true。
解决方法:
所以,当我们只需要比较值的时候,为了避开128陷阱,采用equals()方法比较即可。