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

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么兩個具有相同值的原始雙精度具有兩個不同的標(biāo)識哈希代碼?

為什么兩個具有相同值的原始雙精度具有兩個不同的標(biāo)識哈希代碼?

幕布斯7119047 2022-09-22 16:11:03
我了解到所有具有相同值的原語都具有相同的,因此,當(dāng)我嘗試使用具有相同值的2個雙精度值時,我想獲得一些 primitives.so,它給出的不同,我做了以下操作:identityHashCodeidentityHashCodeidentityHashCodeint xInt=5;int yInt=5;System.out.println(System.identityHashCode(xInt));//output:1867083167System.out.println(System.identityHashCode(yInt));//output:1867083167double double1=5;double double2=5;System.out.println(System.identityHashCode(double1));//output:1915910607System.out.println(System.identityHashCode(double2));//output:1284720968具有相同值的兩個整數(shù)具有相同的,但具有相同值的兩個雙精度值具有不同,為什么會這樣?identityHashCodeidentityHashCode
查看完整描述

4 回答

?
慕蓋茨4494581

TA貢獻(xiàn)1850條經(jīng)驗 獲得超11個贊

您的代碼正在對基元值進(jìn)行裝箱。(基元值本身沒有標(biāo)識哈希代碼,因為這只是一個與對象相關(guān)的概念。您的代碼等效于以下內(nèi)容:


int xInt=5;

int yInt=5;


Integer xInteger = xInt;

Integer yInteger = yInt;


System.out.println(System.identityHashCode(xInteger));

System.out.println(System.identityHashCode(yInteger));


double double1=5;

double double2=5;


Double boxedDouble1 = double1;

Double boxedDouble2 = double2;


System.out.println(System.identityHashCode(boxedDouble1));

System.out.println(System.identityHashCode(boxedDouble2));

現(xiàn)在,如果你比較參考文獻(xiàn)本身,你會發(fā)現(xiàn)這是真的,但卻是錯誤的......所以準(zhǔn)確地代表了這種關(guān)系。xInteger == yIntegerboxedDouble1 == boxedDouble2identityHashCode


框內(nèi)整數(shù)引用引用同一對象的原因是緩存特定范圍內(nèi)的框內(nèi)整數(shù)類型:


如果裝箱值 p 是計算布爾型、char、短整型、整數(shù)型或長整型常量表達(dá)式 (§15.28) 的結(jié)果,并且結(jié)果為 true、false、“\u0000”到“\u007f”(包括)范圍內(nèi)的字符,或介于 -128 到 127(包括 128 和 127)范圍內(nèi)的整數(shù),則設(shè) a 和 b 是 p 的任意兩次裝箱轉(zhuǎn)換的結(jié)果??偸?a == b 的情況。


在實踐中,范圍實際上可以更大,并且實現(xiàn)也可以緩存盒裝雙精度值,但我還沒有看到這種情況發(fā)生。


查看完整回答
反對 回復(fù) 2022-09-22
?
料青山看我應(yīng)如是

TA貢獻(xiàn)1772條經(jīng)驗 獲得超8個贊

這里有一個拳擊問題 - 您無法將原始數(shù)據(jù)類型與標(biāo)識HashCode進(jìn)行比較,因為它用作其參數(shù)。Object

返回給定對象的哈希代碼,與默認(rèn)方法 hashCode() 返回的哈希代碼相同

但當(dāng)然與 .doubleDouble


查看完整回答
反對 回復(fù) 2022-09-22
?
BIG陽

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

我了解到所有具有相同值的基元都具有相同的標(biāo)識哈希代碼。

那里至少有兩個誤解。首先,基元根本沒有哈希代碼或身份哈希代碼。對象可以做到這一點,例如通過自動裝箱基元值獲得的包裝器對象。

其次,正如你自己的實驗所證明的那樣,整體想法是完全錯誤的。如果提供基元作為參數(shù),則它將自動裝入相應(yīng)包裝類的實例中,并返回結(jié)果對象的標(biāo)識哈希代碼。對象的標(biāo)識哈希代碼在其生存期內(nèi)具有該對象的唯一特征,并且與其狀態(tài)無關(guān)。沒有兩個同時存在的對象具有相同的標(biāo)識哈希代碼。因此,更有趣的是,您獲得的不是自動裝箱 s 的不同身份哈希代碼,而是自動裝箱小整數(shù)的相同身份哈希碼。System.identityHashCode()double

實際上,這表明 Java 為小整數(shù)值維護(hù)了一個對象緩存。它在對所涵蓋的范圍內(nèi)的值進(jìn)行自動裝箱處理時,以及在處理對這些值的顯式調(diào)用時使用這些值。因此,在您的示例中,每次自動裝入整數(shù) 5 時,您都會獲得相同的對象,并且您會看到相同的標(biāo)識哈希代碼。如果您使用了足夠大的值,則不會看到相同的效果。IntegerInteger.valueOf()

Java 不會對值為 5.0 的 s 執(zhí)行此類高速緩存。Double

另一方面,也許你只是誤解了這個教訓(xùn)。表示相同基元類型和值的不同包裝對象不具有相同的標(biāo)識哈希代碼,但它們確實具有相同的(常規(guī))哈希代碼,因為對于包裝類,這是由它們表示的原始值確定的。因此,將代碼的結(jié)果與以下結(jié)果進(jìn)行比較:

    System.out.println(Double.valueOf(double1).hashCode());
    System.out.println(Double.valueOf(double2).hashCode());


查看完整回答
反對 回復(fù) 2022-09-22
?
心有法竹

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

我了解到所有具有相同值的原語都具有相同的標(biāo)識哈希代碼

這不可能是真的,因為根據(jù)定義,原語不是對象,因此首先沒有標(biāo)識哈希代碼。

調(diào)用 時,參數(shù)被框起來為整數(shù)或雙精度值。System.identityHashCode()

整數(shù)裝箱對常用整數(shù)(默認(rèn)情況下從 -128 到 127)使用緩存。雙拳擊的情況并非如此。

嘗試使用大int,您也會得到不同的結(jié)果。


查看完整回答
反對 回復(fù) 2022-09-22
  • 4 回答
  • 0 關(guān)注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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