JVM - 基本类型的包装类和对象池
生活随笔
收集整理的這篇文章主要介紹了
JVM - 基本类型的包装类和对象池
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- Pre
- 八大基本類型
- Demo
Pre
JVM - 深入剖析字符串常量池
學習了String 字符串常量池。
接下來我們也順便看下基本類型的包裝類和起對應的對象池
JDK1.8
八大基本類型
Java基本類型共有八種,基本類型可以分為三類,
- 字符類型char
- 布爾類型boolean
- 數值類型byte、short、int、long、float、double
java中基本類型的包裝類的大部分都實現了常量池技術(嚴格來說應該叫對象池,在堆上),這些類是Byte,Short,Integer,Long,Character,Boolean,另外兩種浮點數類型的包裝類Float 、Double則沒有實現。
另外Byte,Short,Integer,Long,Character這5種整型的包裝類也只是在對應值小于等于127時才可使用對象池,也即對象不負責創建和管理大于127的這些類的對象。
因為一般這種比較小的數用到的概率相對較大。
Demo
JDK版本 1.8
public class BasicTypePoolTest {public static void main(String[] args) {//5種整形的包裝類Byte,Short,Integer,Long,Character的對象,//在值小于127時可以使用對象池Integer i1 = 127; //這種調用底層實際是執行的Integer.valueOf(127),里面用到了IntegerCache對象池Integer i2 = 127;System.out.println(i1 == i2);//輸出true//值大于127時,不會從對象池中取對象Integer i3 = 128;Integer i4 = 128;System.out.println(i3 == i4);//輸出false//用new關鍵詞新生成對象不會使用對象池Integer i5 = new Integer(127);Integer i6 = new Integer(127);System.out.println(i5 == i6);//輸出false//Boolean類也實現了對象池技術Boolean bool1 = true;Boolean bool2 = true;System.out.println(bool1 == bool2);//輸出true//浮點類型的包裝類沒有實現對象池技術Double d1 = 1.0;Double d2 = 1.0;System.out.println(d1 == d2);//輸出false} }使用jclasslib插件來看下字節碼問津
Interger i = 127對應
所以 最根本的代碼是
看看 valueOf的源碼吧
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}很明顯了吧, 默認 -128 ~ 127 緩存。
所以
Integer i1 = 127; Integer i2 = 127;System.out.println(i1 == i2);//輸出true實際是執行的Integer.valueOf(127),里面用到了IntegerCache對象池
Integer i1 = 128; Integer i2 = 128;System.out.println(i1 == i2);//輸出false值大于127時,不會從對象池中取對象
最后看一個Double的
從字節碼文件中可以看出 本質上 Double.valueOf
直接new Double() ,所以false .
總結
以上是生活随笔為你收集整理的JVM - 基本类型的包装类和对象池的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM - 深入剖析字符串常量池
- 下一篇: JVM - 一个案例反推不同JDK版本的