Java基本数据类型缓存池剖析(IntegerCache)
3.5 基本数据类型缓存池
“三妹,今天我们来补一个小的知识点:Java 基本数据类型缓存池。”我喝了一口枸杞泡的茶后对三妹说,“考你一个问题哈:new Integer(18) 与 Integer.valueOf(18) 的区别是什么?”
“难道不一样吗?”三妹有点诧异。
“不一样的。”我笑着说。
new Integer(18)每次都会新建一个对象;Integer.valueOf(18)会使⽤用缓存池中的对象,多次调用只会取同⼀一个对象的引用。
来看下面这段代码:
Integer x = new Integer(18);
Integer y = new Integer(18);
System.out.println(x == y);
Integer z = Integer.valueOf(18);
Integer k = Integer.valueOf(18);
System.out.println(z == k);
Integer m = Integer.valueOf(300);
Integer p = Integer.valueOf(300);
System.out.println(m == p);
来看一下输出结果吧:
false
true
false
“第一个 false,我知道原因,因为 new 出来的是不同的对象,地址不同。”三妹解释道,“第二个和第三个我认为都应该是 true 啊,为什么第三个会输出 false 呢?这个我理解不了。”
“其实原因也很简单。”我胸有成竹地说。
基本数据类型的包装类除了 Float 和 Double 之外,其他六个包装器类(Byte、Short、Integer、Long、Character、Boolean)都有常量缓存池。
- Byte:-128~127,也就是所有的 byte 值
- Short:-128~127
- Long:-128~127
- Character:\u0000...
真诚点赞 诚不我欺
回复