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

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

Java: 不同String 相加在內(nèi)存里的分布?

Java: 不同String 相加在內(nèi)存里的分布?

慕哥9229398 2019-02-20 08:40:32
String str1 = "a"; String str2 = "b"; String str3 = "ab"; String str4 = new String("a"); String str5 = new String("b"); String str6= new String("ab"); String plus1 = str1 + str2; String plus2 = str1 + "b"; String plus3 = str4 + "b"; String plus4 = "a" + "b"; String plus5 = str4 + str5; String plus6 = str4 + str2; string相加有上面的6種情況我想弄清楚各種情況的區(qū)別,我知道的是plus4都是在棧區(qū),所以結(jié)果是一個(gè)字符串常量池里的常量,但是其他情況呢?另外,我打印plus1~plus6的地址或者h(yuǎn)ashcode,發(fā)現(xiàn)都是一樣的,怎么回事?
查看完整描述

3 回答

?
慕容708150

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

一樓回答太籠統(tǒng),而且拋開JVM和JDK版本談內(nèi)存分配都是耍流氓。

以提問的為例:

String str1 = "a";
String str2 = "b";
String str3 = "ab";

這種直接定義字符串,JVM認(rèn)為字符串是不變量,也就是線程安全的,因?yàn)檫@種字符串直接分配在方法區(qū)的常量池中.

String str4 = new String("a");
String str5 = new String("b");
String str6= new String("ab");

有new關(guān)鍵字,說(shuō)明這種字符串是分配在堆上.可以使用如下方法驗(yàn)證:

public static void main(String[] args) {
    String str1 = "a";
    String str2 = "b";
    String str3 = "ab";
    
    String str4 = new String("a");
    String str5 = new String("b");
    String str6= new String("ab");
    
    System.out.println(str1 == str4);   // false,說(shuō)明str1和str4的內(nèi)存地址不一樣,一個(gè)在方法區(qū),一個(gè)在堆.
    System.out.println(str1 == str4.intern());  // true,str4存入常量池后并沒有重新創(chuàng)建一塊內(nèi)存,而是使用了已有的常量句柄.
    }

回答一下為什么plus1~6的hashcode一樣,是因?yàn)槟銢]有去重寫String的hashcode方法。而String默認(rèn)hashcode的實(shí)現(xiàn)為:

@Override public int hashCode() {
    int hash = hashCode;
    if (hash == 0) {
        if (count == 0) {
            return 0;
        }
        for (int i = 0; i < count; ++i) {
            hash = 31 * hash + charAt(i);
        }
        hashCode = hash;
    }
    return hash;
}

只是對(duì)字面常量做了處理,而plus1~6的字面常量一樣,所以hashcode值當(dāng)然一致。然后hashcode一致,不代表它們?cè)趈vm分配的內(nèi)存地址一致。

查看完整回答
反對(duì) 回復(fù) 2019-03-01
?
函數(shù)式編程

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

相同字符串在內(nèi)存中只有一個(gè)實(shí)例

------------------------------分割線----------------

本答案過(guò)于籠統(tǒng),且有誤導(dǎo)之嫌,請(qǐng)大家移步正一兄的回答

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

添加回答

舉報(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)