我是靠谱客的博主 大胆硬币,这篇文章主要介绍java.lang.Integer IntegerCache源码分析,现在分享给大家,希望可以做个参考。

 

1、给Integer赋值时,例如:

复制代码
1
Integer a = 127;

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

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

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

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

复制代码
1
2
3
4
5
6
Integer a = 127; Integer b = 127; System.out.println(a == b); // 输出:true System.out.println(a.intValue() == b.intValue()); // 输出:true System.out.println(a.equals(b)); // 输出:true
复制代码
1
2
3
4
5
6
Integer a = 128; Integer b = 128; System.out.println(a == b); // 输出:false System.out.println(a.intValue() == b.intValue()); // 输出:true System.out.println(a.equals(b)); // 输出:true
复制代码
1
2
System.out.println(Integer.valueOf(128) == Integer.valueOf(128)); // 输出false System.out.println(Integer.valueOf(127) == Integer.valueOf(127)); // 输出true

 

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

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

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

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

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

 

最后

以上就是大胆硬币最近收集整理的关于java.lang.Integer IntegerCache源码分析的全部内容,更多相关java.lang.Integer内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部