Java关于整型类缓存[-128,127]之间的数字

我们在学习Java的包装类Integer、Long的时候可能会遇到这个问题:


Integer a = 500;
// Integer a = Integer.valueOf(500); 等价于上面的 Integer b = 500; System.out.println(a == b); // false

② Integer c = 100; Integer d = 100; System.out.println(c == d); // true

 

① 这种情况其实很好理解,因为 Integer是个类,所以创建a对象的时候会在堆中开辟一块空间,创建b对象的时候也会开辟一块空间,所以很显然他们的内存地址是不相等的,所以a != b。

② 那么很多人就会觉得很奇怪,既然都说了他们的内存地址不同,那么第二种情况为什么会相等呢,其实是Java在程序启动的时候就已经缓存了[-128,127]之间的整数。

 

我们可以看一下valueOf的源码

 

 其中IntegerCache.low = -128,IntegerCache.high = 127。

至于Cache数组是什么呢,它其实是在程序启动的时候就创建好的一个范围在[-128, 127]之间的数组。

 

 

 

 

所以当我们调用valueOf的时候,首先会检查是否在[-128, 127]之间,如果在这个区间内就直接从缓存数组中拿出已经缓存好的对象,如果不在这个区间内,那么就创建新的类型。

 

posted @ 2020-05-06 10:02  牛肉叉烧饭w  阅读(520)  评论(0编辑  收藏  举报
levels of contents