最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中Integer包裝類裝箱的一個(gè)細(xì)節(jié)詳解

 更新時(shí)間:2018年07月31日 09:02:00   作者:沉默哥  
Java中的Integer是int的包裝類型,下面這篇文章主要給大家介紹了關(guān)于java中Integer包裝類裝箱的一個(gè)細(xì)節(jié)的相關(guān)資料,文中介紹的這個(gè)細(xì)節(jié)挺重要的,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧

前言

java有八個(gè)基本數(shù)據(jù)類型,每個(gè)都有對(duì)應(yīng)的一個(gè)包裝類,比如int對(duì)應(yīng)的Integer。 Integer 是int的包裝類型,數(shù)據(jù)類型是類,初值為null,從jdk1.5開始,java引入了自動(dòng)拆裝箱,可以直接進(jìn)行形如Integer i = 20形式的賦值,編譯器會(huì)自動(dòng)將其轉(zhuǎn)換為Integer i = Integer.valueOf(20)進(jìn)行裝箱,拆箱則是將int j = i的形式轉(zhuǎn)換成了int j = i.intValue()

裝箱有個(gè)細(xì)節(jié),如果不注意很容易出錯(cuò),來看一下:

Integer i = 20;
Integer j = Integer.valueOf(20);

System.out.println(i == j);

上面的代碼輸出為

true

好像沒什么問題,那我們形式不變,將數(shù)字20換成200,即

i = 200;
j = Integer.valueOf(200);

System.out.println(i == j);

同樣的判斷,輸出變成了:

false

這是為什么呢?

先明確一點(diǎn),經(jīng)過編譯器編譯后,Integer i = 20轉(zhuǎn)換成了Integer i = Integer.valueOf(20) ,和Integer j = Integer.valueOf(20)的定義完全一樣,那為什么將20換成了200后判斷結(jié)果不一樣了呢?

我們來看看Integer.valueOf(int i)方法的內(nèi)部:

 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);
 }

可以看出當(dāng)i在某個(gè)區(qū)間內(nèi)時(shí),直接返回了緩存數(shù)組IntegerCache.cache中的一個(gè)值,超出區(qū)間才new一個(gè)新的Integer對(duì)象。到這里我們大概就可以得出結(jié)論:20在緩存范圍內(nèi)所以直接用了緩存,但是200超出了緩存區(qū)間所以new了新對(duì)象,和原來對(duì)象的地址當(dāng)然不會(huì)相同,所以返回false

再來看看IntegerCache,這是一個(gè)Integer的私有靜態(tài)內(nèi)部類,定義如下:

private static class IntegerCache {
  static final int low = -128;
  static final int high;
  static final Integer cache[];

  static {
   // high value may be configured by property
   int h = 127;
   String integerCacheHighPropValue =
    sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
   if (integerCacheHighPropValue != null) {
    int i = parseInt(integerCacheHighPropValue);
    i = Math.max(i, 127);
    // Maximum array size is Integer.MAX_VALUE
    h = Math.min(i, Integer.MAX_VALUE - (-low));
   }
   high = h;

   cache = new Integer[(high - low) + 1];
   int j = low;
   for(int k = 0; k < cache.length; k++)
    cache[k] = new Integer(j++);
  }

  private IntegerCache() {}
 }

可以看出默認(rèn)的緩存區(qū)間是-128~127,那么什么情況下會(huì)修改這個(gè)范圍呢,修改了某個(gè)虛擬機(jī)參數(shù)的時(shí)候,通過代碼也可看出,設(shè)置的這個(gè)緩存上限java.lang.Integer.IntegerCache.high值不能小于127,小于的話就會(huì)被賦予127,從而失效。
那么這個(gè)值怎么設(shè)置呢?我們來看看jdk源碼中怎么解釋IntegerCache這個(gè)靜態(tài)內(nèi)部類:

Cache to support the object identity semantics of autoboxing for values between -128 and 127 (inclusive) as required by JLS. The cache is initialized on first usage. The size of the cache may be controlled by the -XX:AutoBoxCacheMax= option. During VM initialization, java.lang.Integer.IntegerCache.high property may be set and saved in the private system properties in the sun.misc.VM class.

大概意思是:

將-128到127(包含)的數(shù)字做緩存以供自動(dòng)裝箱使用。緩存在第一次使用時(shí)被初始化。大小可以由JVM參數(shù)-xx:autoboxcachemax=option來指定。JVM初始化時(shí)此值被設(shè)置成java.lang.Integer.IntegerCache.high屬性并作為私有的系統(tǒng)屬性保存在sun.misc.vm.class中。

可以得到結(jié)論:這個(gè)緩存的high值是由JVM參數(shù) -XX:AutoBoxCacheMax= option來指定的。

上述jdk源碼來源于jdk1.7,不同版本實(shí)現(xiàn)略有不同,但思路一致。

這種共享常用對(duì)象的思路有一個(gè)名字,叫享元模式,英文名叫Flyweight,即共享的輕量級(jí)元素。其他包裝類如Boolean、Byte、Short、Long、Charactor都有類似的實(shí)現(xiàn)。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 淺談JSONObject的使用及示例代碼(JSON解析)

    淺談JSONObject的使用及示例代碼(JSON解析)

    這篇文章主要介紹了淺談JSONObject的使用及示例代碼(JSON解析),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • java bootclasspath的具體用法

    java bootclasspath的具體用法

    本文主要介紹了java bootclasspath的具體用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 用GUI實(shí)現(xiàn)java版貪吃蛇小游戲

    用GUI實(shí)現(xiàn)java版貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了用GUI實(shí)現(xiàn)java版貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Java項(xiàng)目防止SQL注入的幾種方法總結(jié)

    Java項(xiàng)目防止SQL注入的幾種方法總結(jié)

    SQL注入是比較常見的網(wǎng)絡(luò)攻擊方式之一,在客戶端在向服務(wù)器發(fā)送請(qǐng)求的時(shí)候,sql命令通過表單提交或者url字符串拼接傳遞到后臺(tái)持久層,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java項(xiàng)目防止SQL注入的幾種方法,需要的朋友可以參考下
    2023-04-04
  • java中關(guān)于getProperties方法的使用

    java中關(guān)于getProperties方法的使用

    這篇文章主要介紹了java中關(guān)于getProperties方法的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Redis中的事務(wù)和Redis樂觀鎖詳解

    Redis中的事務(wù)和Redis樂觀鎖詳解

    這篇文章主要介紹了Redis中的事務(wù)和Redis樂觀鎖詳解,Redis事務(wù)是一個(gè)單獨(dú)的隔離操作:事務(wù)中的所有命令都會(huì)序列化、按順序地執(zhí)行,事務(wù)在執(zhí)行的過程中,不會(huì)被其他客戶端發(fā)送來的命令請(qǐng)求所打斷,需要的朋友可以參考下
    2023-12-12
  • 詳解SpringBoot?Start組件開發(fā)之記錄接口日志信息

    詳解SpringBoot?Start組件開發(fā)之記錄接口日志信息

    這篇文章主要為大家介紹了SpringBoot-Start組件開發(fā)之記錄接口日志信息詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 淺析Java中String與StringBuffer拼接的區(qū)別

    淺析Java中String與StringBuffer拼接的區(qū)別

    String拼接會(huì)創(chuàng)建一個(gè)新的String對(duì)象,存儲(chǔ)拼接后的字符串,StringBuffer拼接是直接在本身拼接,會(huì)即時(shí)刷新。下面通過本文給大家介紹Java中String與StringBuffer拼接的區(qū)別,感興趣的朋友一起看看吧
    2017-06-06
  • Java Web使用簡(jiǎn)單的批處理操作(記事本+Tomcat)

    Java Web使用簡(jiǎn)單的批處理操作(記事本+Tomcat)

    這篇文章主要介紹了Java Web使用簡(jiǎn)單的批處理操作 ,需要的朋友可以參考下
    2014-10-10
  • java輸入多個(gè)數(shù)據(jù)(不確定),排序,并求最大值的方法

    java輸入多個(gè)數(shù)據(jù)(不確定),排序,并求最大值的方法

    今天小編就為大家分享一篇java輸入多個(gè)數(shù)據(jù)(不確定),排序,并求最大值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07

最新評(píng)論

武宁县| 遵义县| 嘉峪关市| 阳谷县| 新竹县| 南昌市| 德钦县| 紫云| 台南市| 宽甸| 扬州市| 肇州县| 大城县| 陵川县| 昌宁县| 丹棱县| 衢州市| 和顺县| 武宣县| 商都县| 尼玛县| 肥城市| 正蓝旗| 巴南区| 花莲县| 南乐县| 且末县| 农安县| 鄂州市| 永宁县| 赤城县| 莱西市| 搜索| 钟祥市| 崇阳县| 合阳县| 澎湖县| 河西区| 广平县| 大兴区| 青河县|