第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么Integer常量池的行為在127發(fā)生變化?

為什么Integer常量池的行為在127發(fā)生變化?

Qyouu 2019-10-10 16:11:25
我無法理解Java常量池常量的工作方式。我了解字符串的行為,因此可以證明自己與整數(shù)常量也是如此。所以,對(duì)于整數(shù)Integer i1 = 127;Integer i2 = 127;System.out.println(i1==i2); // True和Integer i1 = new Integer(127);Integer i2 = new Integer(127);System.out.println(i1==i2); // False直到這里一切都進(jìn)入我的腦海。我無法消化的是,當(dāng)我從127增加整數(shù)時(shí),它的行為有所不同。此行為在127之后發(fā)生變化,下面是代碼段Integer i1 = 128;Integer i2 = 128;System.out.println(i1==i2); // False. WHY?????有人可以幫我理解嗎?
查看完整描述

3 回答

?
江戶川亂折騰

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊

不,數(shù)字常量池的工作方式不同于字符串。對(duì)于字符串,只保留編譯時(shí)常量-而對(duì)于整數(shù)類型的包裝器類型,如果任何裝箱操作都適用于該值,則任何裝箱操作都將始終使用該池。因此,例如:


int x = 10;

int y = x + 1;

Integer z = y; // Not a compile-time constant!

Integer constant = 11;

System.out.println(z == constant); // true; reference comparison

JLS保證池值的范圍很小,但是實(shí)現(xiàn)可以根據(jù)需要使用更大的范圍。


請(qǐng)注意,盡管不能保證,但是我看過的每個(gè)實(shí)現(xiàn)都可以Integer.valueOf用來執(zhí)行裝箱操作-因此,即使沒有該語言的幫助,您也可以得到相同的效果:


Integer x = Integer.valueOf(100);

Integer y = Integer.valueOf(100);

System.out.println(x == y); // true

從JLS的5.1.7節(jié)開始:


如果裝箱的值p為true,false,一個(gè)字節(jié)或介于\ u0000到\ u007f范圍內(nèi)的char或-128到127(含)之間的整數(shù)或短數(shù),則令r1和r2為p的任何兩次拳擊轉(zhuǎn)換。r1 == r2總是這樣。


理想情況下,將給定的原始值p裝箱將始終產(chǎn)生相同的參考。實(shí)際上,使用現(xiàn)有的實(shí)現(xiàn)技術(shù)可能不可行。以上規(guī)則是一種務(wù)實(shí)的妥協(xié)。上面的最后一個(gè)子句要求始終將某些通用值裝在無法區(qū)分的對(duì)象中。該實(shí)現(xiàn)可以懶惰地或急切地緩存它們。對(duì)于其他值,此公式不允許對(duì)程序員方面的帶框值的身份進(jìn)行任何假設(shè)。這將允許(但不要求)共享部分或全部這些引用。


這樣可以確保在大多數(shù)情況下,行為都是理想的,而不會(huì)造成不必要的性能損失,尤其是在小型設(shè)備上。例如,較少內(nèi)存限制的實(shí)現(xiàn)可能會(huì)緩存所有char和short值,以及-32K到+ 32K范圍內(nèi)的int和long值。


查看完整回答
反對(duì) 回復(fù) 2019-10-10
?
三國(guó)紛爭(zhēng)

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊

Java維護(hù)從-128到的Integer池127


像下面這樣聲明整數(shù)


Integer i1 = 127;

結(jié)果到


Integer i1 = Integer.valueOf(127);

所以第一種情況實(shí)際發(fā)生的是


Integer i1 = 127;<---Integer.valueOf(127);

Integer i2 = 127;<---Integer.valueOf(127);<---Same reference as first

從Integerfor類  valueOf 方法的源代碼


public static Integer valueOf(int i) {

    if(i >= -128 && i <= IntegerCache.high)

        return IntegerCache.cache[i + 128];

    else

        return new Integer(i);

}

因此,如果值介于-128到之間,則得到相同的引用,127然后調(diào)用valueOf它,否則它將返回new Integer(i)


并且由于引用相同,因此您的==運(yùn)算符適用valueOf于此范圍之間返回的整數(shù)。


查看完整回答
反對(duì) 回復(fù) 2019-10-10
?
HUX布斯

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個(gè)贊

Java緩存range中的整數(shù)對(duì)象-128 to 127。因此,當(dāng)您嘗試在此范圍內(nèi)為wrapper對(duì)象分配一個(gè)值時(shí),該boxing操作將調(diào)用Integer.valueOf方法,然后它將對(duì)池中已存在的對(duì)象分配一個(gè)引用。


另一方面,如果將超出此范圍的值分配給wrapper引用類型,Integer.valueOf則會(huì)Integer為該值創(chuàng)建一個(gè)新對(duì)象。因此,比較具有超出此范圍值的referencefor Integer對(duì)象將為您提供false


所以,


Integer i = 127;  --> // Equivalent to `Integer.valueOf(127)`

Integer i2 = 127;


// Equivalent to `Integer.valueOf(128)`

// returns `new Integer(128)` for value outside the `Range - [-128, 127]`

Integer i3 = 128; 

Integer i4 = 128;


System.out.println(i == i2); // true, reference pointing to same literal

System.out.println(i3 == i4); // false, reference pointing to different objects

但是,當(dāng)您使用new運(yùn)算符創(chuàng)建整數(shù)實(shí)例時(shí),將在堆上創(chuàng)建一個(gè)新對(duì)象。所以,


Integer i = new Integer(127);

Integer i2 = new Integer(127);


System.out.println(i == i2); // false


查看完整回答
反對(duì) 回復(fù) 2019-10-10
  • 3 回答
  • 0 關(guān)注
  • 827 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)