public class comjava {
public static void main(String[] args) {
int n = 128;
int n1 = 128;
int m = 1270;
Integer m1 = 1270;
Integer d = 128;
Integer d1 = 128;
System.out.println(n==n1);
System.out.println(n1);
System.out.println(m==m1);
System.out.println(m1);
System.out.println(d==d1);
System.out.println(d.equals(d1));
System.out.println(d1);
Integer.valueOf(13);
}
}
针对上述代码结果是什么呢?
128陷阱的具体表现
- 在-128到127范围内:当你使用==操作符比较两个在这个范围内通过自动装箱创建的Integer对象时,由于它们实际上是缓存池中的同一个实例,所以比较结果为true。
- 超出-128到127范围:对于超出这个范围的值,Java不会自动缓存Integer对象。因此,即使两个Integer对象的值相同,它们也是不同的实例,使用==操作符比较时结果为false。与==操作符不同,equals()方法在Integer类中被重写,用于比较两个对象的值是否相等,而不是它们是否是同一个实例。因此,即使两个Integer对象不是同一个实例,只要它们的值相等,equals()方法就会返回true
128陷阱的原理
主要涉及Java编程中Integer对象的比较行为,特别是与==操作符和equals()方法的使用相关。这个陷阱的核心在于Java的自动装箱(autoboxing)和整数缓存机制(Integer Cache)。
关于Integer.valueof的代码,可以看出:Java中的Integer类对于值在-128到127范围内的对象使用了一个缓存机制。这意味着当你通过自动装箱(如Integer a = 100;
)在这个范围内创建一个Integer对象时,Java实际上是从一个预先存在的缓存池中获取这个值的实例,而不是创建一个新的实例。因此,所有在这个范围内通过自动装箱创建的Integer对象都会引用缓存池中的同一个实例。
如何避免128陷阱
- 理解==和equals()的区别:使用==仅用于比较基本类型和检查对象引用是否相同;使用equals()方法来比较对象的值是否相等。
- 明确使用equals()方法:当你需要比较两个Integer对象的值时,始终使用equals()方法,而不是==。
- 警惕自动装箱:了解自动装箱和拆箱的行为及其在代码中的作用,尤其是当处理大范围的整数时。
结论
128陷阱是Java开发中容易遇到的一个问题,特别是在处理Integer对象的比较时。理解整数缓存机制和正确使用equals()方法是避免这个陷阱的关键。
标签:equals,System,println,陷阱,128,Integer,通俗,out From: https://blog.csdn.net/2302_80155670/article/details/140289171