所谓128陷阱,指的是两个
Integer
对象在 ( − 128 , 127 ) (-128, 127) (−128,127) 范围内取相同值并且用==
进行判定时,返回为true
;如果在该范围之外取相同值判定则返回false
。
“==”和equals
- “==”是运算符,如果比较的数据是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址。
- equals是父类Object的方法,比较的是所指向的对象的地址,一般情况下,重写之后比较的是对象的值。
int和Integer
- Integer是int的包装类;int是基本数据类型。
- Integer变量必须实例化后才能使用;int变量不需要。
- Integer的默认值是null;int的默认值是0。
- 更多详情可以查看:Java中的8种基本数据类型及其存储方式。
128陷阱
- 两个
Integer
对象在 ( − 128 , 127 ) (-128, 127) (−128,127) 范围内取值用==进行比较,如果值相同则返回true
。
这是因为引用类型用==判定,就是在判定两个对象地址是否相同。Java 对于值在 ( − 128 , 127 ) (-128, 127) (−128,127) 范围内的 Integer 对象会自动缓存,这表示如果你使用自动装箱创建了一个Integer
对象,并且该值在 -128 到 127 之间,Java 会使用相同的实例对象。
Integer x1 = 127;
Integer x2 = 127;
System.out.println(x1 == x2); //true
- 两个
Integer
对象直接用==在 ( − 128 , 127 ) (-128, 127) (−128,127) 范围外判定,无论值是否相同返回都为false
;
如果传入数值不在范围内,Integer 对象不会被缓存,每次都会创建新的对象。那么每次被创建的对象都指向一个新的且不同的地址,即通过new关键字由JVM分配的新地址。因此,即使两个 Integer 对象的值相同,它们也不会是同一个实例。
Integer x1 = 128;
Integer x2 = 128;
System.out.println(x1 == x2); //false
- 一个
int
类型和一个Integer
对象用==判定,若值相同返回true。
这是因为Integer
是int
的封装类,当int
和Integer
进行==比较的时候,Integer
会自动拆装为int
类型,所以返回true
int x1 = 128;
Integer x2 = 128;
System.out.println(x1 == x2); //true
- equals() 方法在
Integer
类中被重写用于比较两个对象的值是否相等。因此,即使两个Integer
对象不是同一个实例,只要它们的值相等,equals() 方法就会返回true
。
Integer x1 = 128;
Integer x2 = 128;
System.out.println(x1.equals(x2)); //true
如何避免128陷阱
所有整型包装类对象之间值的比较,全部使用 equals 方法比较。