java 包裝類的快取機制

2021-08-12 00:12:37 字數 1405 閱讀 9920

1、前提:發生自動裝箱的過程(基本型別–>包裝型別)

建立乙個包裝類物件有兩種方法:

(1)構造器方法(就是new出來);

(2)自動裝箱(就是編譯器自動呼叫包裝類的valueof方法);

兩種方法的區別:

構造器方法:不論值的大小,返回的將都會是乙個新物件;

自動裝箱會先經過判斷,再決定返回的是乙個新物件還是常量池中已存在的物件。

2、機制:當通過自動裝箱機制建立包裝類物件時,首先會判斷數值是否在-128—-127的範圍內,如果滿足條件,則會從快取(常量池)中尋找指定數值,若找到快取,則不會新建物件,只是指向指定數值對應的包裝類物件,否則,新建物件。

3、原理:

(1)當包裝類載入時,該包裝類中的內部類xxcache會初始化乙個包裝類型別陣列,最小值(固定值)為-128,而最大值(預設值)為127【可修改】,這個長度的快取值放在方法區的常量池中,是所有執行緒共享的。

private

static

class

integercache catch( numberformatexception nfe)

}high = h;

cache = new integer[(high - low) + 1];

int j = low;

for(int k = 0; k < cache.length; k++)

cache[k] = new integer(j++);

// range [-128, 127] must be interned (jls7 5.1.7)

assert integercache.high >= 127;

}private

integercache() {}

}

(2)當發生自動包裝的時候,呼叫valueof方法,對需要包裝的基本型別的值進行判斷,如果在快取值的範圍內,則返回快取的物件,否則建立乙個新的物件返回。

自動裝箱的valueof方法原始碼(integer型別舉例):

public

static integer valueof(int i)

return

new integer(i);

}

4、快取的作用

在快取值範圍內的物件可以直接在常量池中取出,不用建立新的物件;

當需要頻繁的使用同一物件的時候,如果有快取,則可以避免重複建立同一物件,節省空間開銷和時間消耗,提公升了效能。

去檢視八大包裝類型別的原始碼即可知道哪些包裝類是否有快取機制。

integer 、byte 、short 、long 、character 五大包裝類都有緩衝機制,且緩衝的預設值範圍都是-128~127

而float,double,boolean 三大包裝類並沒有緩衝機制。

Java包裝類的快取範圍

包裝類提供了物件的快取,具體的實現方式為在類中預先建立頻繁使用的包裝類物件,當需要使用某個包裝類的物件時,如果該物件封裝的值在快取的範圍內,就返回快取的物件,否則建立新的物件並返回。在包裝類中,快取的基本資料型別值得範圍如下 包裝型別 基本資料型別 快取物件 基本資料型別值 boolean bool...

Java包裝模擬較和包裝類底層快取陣列

關於包裝類的比較問題,我們先看以下 integer i1 100 integer i2 100 integer i3 200 integer i4 200 system.out.println i1 i2 true system.out.println i3 i4 false double d1 1...

包裝類的快取問題

整型,char型別所對應的包裝類,在自動裝箱時,對於 128 127之間的值會進行快取處理,從而提高效率 快取的原理是 如果資料在 128到127這個區間內,則在類載入的時候就已經為該區間內的每個數值建立了物件,並且把這256個物件都放在乙個叫cahce的陣列中 原始碼如下 public stati...