java.lang.Integer IntegerCache源码分析

喜欢ヅ旅行 2022-05-22 05:06 352阅读 0赞

1、给Integer赋值时,例如:

  1. Integer a = 127;

Integer会初始化一个IntegerCache.cache的数组,数组里面存储-128 到 127之间的数字。初始化源码:

70

2、调用Integer.valueOf(int i)方法,如果i在-128 到 127之间,就会从IntegerCache.cache取出i对应的Integer对象;如果不在这个区间,就会返回new Integer(i);源码如下:

  1. public static Integer valueOf(int i) {
  2. assert IntegerCache.high >= 127;
  3. if (i >= IntegerCache.low && i <= IntegerCache.high)
  4. return IntegerCache.cache[i + (-IntegerCache.low)];
  5. return new Integer(i);
  6. }

运行如下代码,实际测试一下:

  1. Integer a = 127;
  2. Integer b = 127;
  3. System.out.println(a == b); // 输出:true
  4. System.out.println(a.intValue() == b.intValue()); // 输出:true
  5. System.out.println(a.equals(b)); // 输出:true
  6. Integer a = 128;
  7. Integer b = 128;
  8. System.out.println(a == b); // 输出:false
  9. System.out.println(a.intValue() == b.intValue()); // 输出:true
  10. System.out.println(a.equals(b)); // 输出:true
  11. System.out.println(Integer.valueOf(128) == Integer.valueOf(128)); // 输出false
  12. System.out.println(Integer.valueOf(127) == Integer.valueOf(127)); // 输出true

a=128,b=128时,debug可以看到a和b是两个不同的对象(id不同):

70 1

a=127,b=127时,debug可以看到a和b是同一个对象(id相同):

70 2

因为==比较的是对象的引用地址,当不是同一个对象时,==得出的肯定是false。

而equals方法被重写了,做的是值比对,所以equals输出的是true:

  1. public boolean equals(Object obj) {
  2. if (obj instanceof Integer) {
  3. return value == ((Integer)obj).intValue();
  4. }
  5. return false;
  6. }

发表评论

表情:
评论列表 (有 0 条评论,352人围观)

还没有评论,来说两句吧...

相关阅读