Java中Integer的相等判断:为什么==双等号判断有时正确有时不正确

Java中Integer的相等判断:为什么==双等号判断有时正确有时不正确

在Java编程中,包装类(如Integer)的使用是非常普遍的。理解装箱、拆箱以及它们在内存中的行为,对于优化性能和避免潜在的错误至关重要。本文将重点讨论Integer类的装箱和拆箱,特别是-128到127范围内的缓存机制。

什么是装箱和拆箱?

  • 装箱(Boxing):将基本数据类型(如int)转换为其对应的包装类(如Integer)。
  • 拆箱(Unboxing):将包装类转换回其对应的基本数据类型。

例如:

int primitive = 5; 
Integer wrapped = primitive; // 装箱 
int unwrapped = wrapped; // 拆箱

Integer的缓存机制

Java对Integer类进行了优化,特别是在-128到127的范围内。这个范围的Integer对象会被缓存,意味着相同值的Integer实例会引用同一个对象。这种做法可以节省内存并提高性能。

示例代码

Integer i = 1; 
Integer j = 1;
System.out.println(i == j); // 输出: true 
Integer i2 = 200; 
Integer j2 = 200; 
System.out.println(i2 == j2); // 输出: false

在上面的代码中:

  • ij都是1,它们在-128到127的范围内,因此它们引用的是同一个对象,i == j返回true
  • i2j2都是200,超出了缓存范围,所以它们是不同的对象,i2 == j2返回false

相等判断:equals方法

虽然==运算符用于比较对象的引用(内存地址),但Integer类重写了equals方法,以便比较两个Integer对象的值。因此,即使两个Integer对象的引用不同,只要它们的值相等,equals方法也会返回true

示例代码

System.out.println(i2.equals(j2)); // 输出: true

虽然i2j2是不同的对象,但它们的值都是200,因此equals方法返回true

在Java中,除了Integer,其他基本数据类型也有相应的包装类,如DoubleCharacterBoolean等。

缓存机制

 Integer

  • 缓存范围:-128到127
  • 超出范围的对象会被新创建。

2. Byte

  • 缓存范围:-128到127
  • 行为与Integer相同。

3. Short

  • 缓存范围:-128到127
  • 行为与Integer相同。

4. Long

  • 不同于IntegerLong没有内置的缓存机制,所有的Long对象都是新创建的。

5. Character

  • 缓存范围:\u0000\u007F(即0到127)
  • 其他字符会新创建对象。

6. Boolean

  • 只有两个值:truefalse,这两个值是常量,Java会缓存它们。

7. Double 和 Float

  • 这两个包装类没有内置的缓存机制,所有对象都将被新创建。
Byte b1 = 100;
Byte b2 = 100;
System.out.println(b1 == b2); // 输出: true

Short s1 = 1000;
Short s2 = 1000;
System.out.println(s1 == s2); // 输出: false

Character c1 = 'A';
Character c2 = 'A';
System.out.println(c1 == c2); // 输出: true

Boolean bool1 = true;
Boolean bool2 = true;
System.out.println(bool1 == bool2); // 输出: true

Double d1 = 10.5;
Double d2 = 10.5;
System.out.println(d1 == d2); // 输出: false

 

用云无忧
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容