亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java基礎數據類型自動裝箱的緩存

2019-11-06 06:35:33
字體:
來源:轉載
供稿:網友

java 5開始,基礎數據類型被賦予了自動裝箱和自動拆箱機制。

問題


public static void main(String[] args) { Integer a = 100, b = 100, c = 1000, d = 1000; System.out.PRint(a == b);//true System.out.print(','); System.out.println(c == d);//false}

打印結果為true,false 這是為什么呢?

原因


這是由于Integer在自動裝箱過程中使用了緩存機制。

基礎數據類型在自動裝箱過程中會使用緩存機制來提高效率,在緩存范圍內相同值的自動裝箱對象相同(==為true),本文將總結基礎數據類型在自動裝箱過程中的緩存特點。

話不多說,先上結果:

類型 字節數 包裝類型 緩存范圍 說明
byte 1 Byte -128 ~ 127 全部緩存
short 2 Short -128 ~ 127 部分緩存
int 4 Integer -128 ~ 127 部分緩存最大值默認為127可以通過設定JVM啟動參數-XX:AutoBoxCacheMax=<size>來修改緩存的最大值
long 8 Long -128 ~ 127 部分緩存
char 2 Character 0 ~ 127 部分緩存
boolean 1或4 Boolean true, false 全部緩存boolean類型在編譯后使用java虛擬機的int數據類型代替,boolean數組則被編碼為byte數組
float 4 Float 沒有緩存
double 8 Double 沒有緩存

分析


我們知道,在自動裝箱過程中,使用了對應包裝類的valueOf靜態方法

例如:Integer num = 100;等價于Integer num = Integer.valueOf(100);

1. int

Integer中自動裝箱使用的valueOf函數定義如下:

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

可以看到在IntegerCache.low ~ IntegerCache.high之間的數字,將會從緩存中獲取,在這個區間之外的數字,將創建一個新的Integer對象。 接下來再來看看IntegerCache的定義(它是定義在Integer內部的一個靜態類):

/** * 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=<size> 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. */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) -1); } 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() {}}

通過代碼及注釋,我們可以了解到以下幾點信息:

在IntegerCache中定義了一個Integer數組cache在first usage(IntegerCache類被加載)時進行初始化其緩存范圍默認為從-128至127可以通過-XX:AutoBoxCacheMax=<size>來控制cachesize

所以,在默認情況下,-128~127范圍內的自動裝箱使用了緩存,相同的值自動裝箱后的對象相同(即a == b 為true)。

延伸閱讀: 為什么java中要做IntegerCache這種設置?

2. byte/short/long

byte/short/long對應的包裝類的緩存方式與Integer不同,沒有用到自定義Cache類,而是直接在包裝類內部定義了一個長度為256的緩存數組:

2.1 byte

public static Byte valueOf(byte b) { return VALUES[b + 128];}private static final Byte[] VALUES = new Byte[256];static { for (int i = -128; i < 128; i++) { VALUES[i + 128] = new Byte((byte) i); }}

2.2 short

public static Short valueOf(short s) { return s < -128 || s >= 128 ? new Short(s) : SMALL_VALUES[s + 128];}private static final Short[] SMALL_VALUES = new Short[256];static { for (int i = -128; i < 128; i++) { SMALL_VALUES[i + 128] = new Short((short) i); }}

2.3 long

public static Long valueOf(long v) { return v >= 128 || v < -128 ? new Long(v) : SMALL_VALUES[((int) v) + 128];}private static final Long[] SMALL_VALUES = new Long[256];static { for (int i = -128; i < 128; i++) { SMALL_VALUES[i + 128] = new Long(i); }}

3. char

char的包裝類型Character的自動裝箱緩存方式類似于byte/short/long,不過緩存長度只有128(0~127)

public static Character valueOf(char c) { return c < 128 ? SMALL_VALUES[c] : new Character(c);}private static final Character[] SMALL_VALUES = new Character[128];static { for (int i = 0; i < 128; i++) { SMALL_VALUES[i] = new Character((char) i); }}

4. boolean

boolean只有2個值:true和false,在源碼中valueOf方法使用了2個常量來進行自動裝箱

public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE;}

5. float/double

float和double都屬于浮點型,自動裝箱沒有使用緩存,任何相同的值自動裝箱后用==來判斷都會返回false

5.1 float

public static Float valueOf(float f) { return new Float(f);}

5.2 double

public static Double valueOf(double d) { return new Double(d);}

總結


在使用基礎數據類型時,我們需要注意自動裝箱及自動拆箱的影響。特別是在使用==來進行判斷的時候要注意自動裝箱的緩存

參考文檔:


官方文檔 Primitive Data Types你真的知道Java中boolean類型占用多少個字節嗎?Java 7之基礎類型第1篇 - Java數據類型
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧洲一区二区三区在线观看| 狠狠躁夜夜躁人人爽超碰91| 日韩激情av在线播放| 国产69精品久久久| 国产精品久久久久久久久久久新郎| 亚洲国产精品嫩草影院久久| 成人在线精品视频| 国产精品一区二区av影院萌芽| 日韩av在线播放资源| 欧洲日本亚洲国产区| 欧美性猛交xxxx乱大交蜜桃| 精品成人在线视频| 亚洲人精选亚洲人成在线| 亚洲影视九九影院在线观看| 久久精品免费播放| 亚洲国产99精品国自产| 亚洲美女精品成人在线视频| 日韩激情第一页| 5252色成人免费视频| 免费不卡在线观看av| 97涩涩爰在线观看亚洲| 亚洲精品aⅴ中文字幕乱码| 久久精彩免费视频| 欧美大学生性色视频| 日韩视频在线一区| 免费91在线视频| 97精品一区二区视频在线观看| 欧美日本中文字幕| 欧美日韩在线第一页| 欧美一区二区大胆人体摄影专业网站| 亚洲三级 欧美三级| 4k岛国日韩精品**专区| 91久久中文字幕| 亚洲第一免费播放区| 国产欧美一区二区| 神马国产精品影院av| 亚洲精品少妇网址| 97精品欧美一区二区三区| 欧美日韩精品二区| 精品国产一区二区三区久久久狼| 国产精品欧美一区二区| 国产精品777| www.99久久热国产日韩欧美.com| 成人有码在线视频| 亚洲福利在线视频| 日韩成人av在线| 成人精品一区二区三区电影免费| 国产中文字幕日韩| 97国产精品人人爽人人做| 日本最新高清不卡中文字幕| 91在线视频九色| 欧美一级大片在线观看| 国产suv精品一区二区三区88区| 九九久久精品一区| 欧美福利视频在线观看| 日韩在线视频线视频免费网站| 亚洲色图15p| 国内自拍欧美激情| 国产精品久久久久免费a∨| 精品久久久久久久久久久| 国产精品一区二区女厕厕| 精品国偷自产在线| 国产精品丝袜白浆摸在线| 欧美性猛交xxxx久久久| 国产精品美乳在线观看| 91a在线视频| 在线观看中文字幕亚洲| 亚洲高清一区二| 欧美成人一二三| 精品女同一区二区三区在线播放| 这里只有视频精品| 欧美成人亚洲成人| 不卡中文字幕av| 国产成人自拍视频在线观看| 国产一区二区香蕉| 欧美激情xxxx性bbbb| 中文字幕亚洲第一| 国产成人精品一区二区| 亚洲综合日韩在线| 久久青草福利网站| 成人免费视频xnxx.com| 狠狠躁夜夜躁久久躁别揉| 美女久久久久久久| 色婷婷av一区二区三区久久| 欧美大片在线免费观看| 欧美日韩国内自拍| 亚洲aⅴ日韩av电影在线观看| 亚洲综合在线小说| 久久午夜a级毛片| 不卡伊人av在线播放| 精品国产1区2区| 久久久噜噜噜久噜久久| 亚州欧美日韩中文视频| 国产性猛交xxxx免费看久久| 亚洲国产另类 国产精品国产免费| 欧美日韩成人在线播放| 日韩精品高清在线观看| 国产精品高清免费在线观看| 国产视频精品在线| 日韩成人在线网站| 精品色蜜蜜精品视频在线观看| 这里只有精品久久| 亚洲性夜色噜噜噜7777| 欧美专区中文字幕| 在线电影中文日韩| 久久国产精品久久精品| 午夜精品福利视频| 国产成人精品久久二区二区91| 亚洲福利在线播放| 国产精品h在线观看| 成人写真福利网| 日韩在线一区二区三区免费视频| 精品综合久久久久久97| 欧美日韩中文字幕日韩欧美| 欧美三级免费观看| 人妖精品videosex性欧美| 日韩欧美第一页| 久久av.com| 色香阁99久久精品久久久| 亚洲2020天天堂在线观看| 欧美日韩亚洲一区二区| 亚洲激情在线视频| 欧美综合在线观看| 中文字幕亚洲图片| 亚洲国产欧美一区二区丝袜黑人| 国产精品久久中文| 在线观看久久久久久| 一区二区三区日韩在线| 成人精品视频99在线观看免费| 欧美有码在线视频| 国产日产欧美a一级在线| 午夜精品久久久久久久99热浪潮| 伊人伊成久久人综合网小说| xx视频.9999.com| 4388成人网| 久久精品电影网站| 久久色在线播放| 欧美国产日本在线| 成人午夜黄色影院| 日本午夜在线亚洲.国产| 91精品国产九九九久久久亚洲| 亚洲最大福利网| 亚洲美女av网站| 成人福利在线视频| 国产精品日韩电影| 国产精品丝袜视频| 91系列在线观看| 日本aⅴ大伊香蕉精品视频| 亚洲一区999| 国产一区二区黑人欧美xxxx| 国产精品视频永久免费播放| 久久久成人的性感天堂| 欧美国产乱视频| 日韩精品在线电影| 亚洲日本欧美中文幕| 亚洲午夜性刺激影院| 国产一区二区视频在线观看| 亚洲精品自拍第一页| 亚洲欧美资源在线| 成人久久一区二区| 亚洲视频一区二区| 亚洲精品美女免费| 久久亚洲成人精品| 国产精品美女www|