日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JVM - 基本类型的包装类和对象池

發布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

對應


所以 最根本的代碼是

Integer i1 = Integer.valueOf(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 - 基本类型的包装类和对象池的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。