欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

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

這是為什么呢?

先明確一點,經(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);
 }

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

再來看看IntegerCache,這是一個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() {}
 }

可以看出默認的緩存區(qū)間是-128~127,那么什么情況下會修改這個范圍呢,修改了某個虛擬機參數(shù)的時候,通過代碼也可看出,設置的這個緩存上限java.lang.Integer.IntegerCache.high值不能小于127,小于的話就會被賦予127,從而失效。
那么這個值怎么設置呢?我們來看看jdk源碼中怎么解釋IntegerCache這個靜態(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ù)字做緩存以供自動裝箱使用。緩存在第一次使用時被初始化。大小可以由JVM參數(shù)-xx:autoboxcachemax=option來指定。JVM初始化時此值被設置成java.lang.Integer.IntegerCache.high屬性并作為私有的系統(tǒng)屬性保存在sun.misc.vm.class中。

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

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

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

總結(jié)

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

相關文章

  • Java的Jackson庫的使用及其樹模型的入門學習教程

    Java的Jackson庫的使用及其樹模型的入門學習教程

    這篇文章主要介紹了Java的Jackson庫的使用及其樹模型入門學習教程,Jackson庫通常被用來作Java對象和JSON的互相轉(zhuǎn)換,需要的朋友可以參考下
    2016-01-01
  • java金錢處理方法實例詳解

    java金錢處理方法實例詳解

    這篇文章主要介紹了java金錢處理方法實例詳解的相關資料,這里提供實現(xiàn)方法分轉(zhuǎn)化成元的實現(xiàn)方法,需要的朋友可以參考下
    2017-08-08
  • SpringBoot中GlobalExceptionHandler異常處理機制詳細說明

    SpringBoot中GlobalExceptionHandler異常處理機制詳細說明

    Spring Boot的GlobalExceptionHandler是一個全局異常處理器,用于捕獲和處理應用程序中發(fā)生的所有異常,這篇文章主要給大家介紹了關于Java中GlobalExceptionHandler異常處理機制的相關資料,需要的朋友可以參考下
    2024-03-03
  • java實現(xiàn)任意矩陣Strassen算法

    java實現(xiàn)任意矩陣Strassen算法

    這篇文章主要介紹了java實現(xiàn)任意矩陣Strassen算法的相關資料,需要的朋友可以參考下
    2016-02-02
  • java 數(shù)學計算的具體使用

    java 數(shù)學計算的具體使用

    這篇文章主要介紹了java 數(shù)學計算的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • Spring中的FactoryBean與BeanFactory詳細解析

    Spring中的FactoryBean與BeanFactory詳細解析

    這篇文章主要介紹了Spring中的FactoryBean與BeanFactory詳細解析,在Spring框架中,FactoryBean和BeanFactory是兩個關鍵的接口,用于創(chuàng)建和管理對象實例,它們在Spring的IoC(Inversion of Control,控制反轉(zhuǎn))容器中發(fā)揮著重要的作用,需要的朋友可以參考下
    2023-11-11
  • Java之如何正確地對包裝類進行裝箱與拆箱

    Java之如何正確地對包裝類進行裝箱與拆箱

    在這篇文章中給大家繼續(xù)講解包裝類的裝箱和拆箱問題。你可能會很好奇,做java開發(fā),怎么還裝起箱子來了?那么就請大家?guī)е苫笸驴窗?/div> 2023-04-04
  • java8中新的Date和Time詳解

    java8中新的Date和Time詳解

    這篇文章主要是java8中新的Date和Time,探討新Date類和Time類背后的設計原則,有所需要的小伙伴希望能幫助到你
    2016-07-07
  • SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解

    SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解

    這篇文章主要介紹了SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解,@EnableWebSecurity是Spring?Security用于啟用Web安全的注解,典型的用法是該注解用在某個Web安全配置類上,實現(xiàn)了接口,需要的朋友可以參考下
    2023-12-12
  • maven中profile的使用

    maven中profile的使用

    本文主要介紹了maven中profile的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04

最新評論