代码示例:

  1. package com.yue.Integer;
  2. public class IntegerTest {
  3. public static void main(String[] args) {
  4. Integer a1 = new Integer(100);
  5. Integer a2 = new Integer(100);
  6. System.out.println(a1 == a2);
  7. Integer b1 = 100;
  8. Integer b2 = 1000;
  9. Integer b3 = 100;
  10. Integer b4 = 1000;
  11. System.out.println(b1 == b3);
  12. System.out.println(b2 == b4);
  13. System.out.println(b1 == a1);
  14. int c = 100;
  15. System.out.println(c == a1);
  16. System.out.println(c == b1);
  17. }
  18. }
  19. /*
  20. * false
  21. * true
  22. * false
  23. * false
  24. * true
  25. * true
  26. */

代码解析:

1.两个new生成的Integer对象比较。

由于Integer实际是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相同的,因为New生成的是两个不同的对象,其内存地址不同。

  1. Integer a1 = new Integer(100);
  2. Integer a2 = new Integer(100);
  3. System.out.println(a1 == a2); // false

2.非new生成的Integer对象比较。

Integer有缓存机制,区间在-127~128的比较结果为true,否则为false。

  1. Integer b1 = 100;
  2. Integer b2 = 1000;
  3. Integer b3 = 100;
  4. Integer b4 = 1000;
  5. System.out.println(b1 == b3); // true
  6. System.out.println(b2 == b4); // false

3.new生成的和非new生成对象比较

非new生成的Integer变量指向的是Java常量池中的对象,而new出来的对象指向的是堆中新建的对象,两者内存地址不同。

  1. System.out.println(b1 == a1); // false

4.int和Integer比较

包装类Integer和基本数据类型比较的时候,java会自动拆箱为int,然后进行比较,实际上就是两个int变量进行比较

  1. int c = 100;
  2. System.out.println(c == a1); // true
  3. System.out.println(c == b1); // true