Java中String字符串的==與equals的區(qū)別以及=賦值與new String的區(qū)別等

前提一:關(guān)于==和equals

  • 對于==锉矢,基本類型比較的是字面量即值梯嗽,引用類型比較的是堆地址;
  • 對于equals方法沽损,基本類型沒有這種寫法灯节,大部分引用類型比較的是堆地址,因?yàn)橐妙愋偷捻敿壐割怬bject的equals方法內(nèi)部使用==直接比較绵估,所以引用類型在沒有重寫equals方法的時候炎疆,使用equals方法就等價于==的堆地址比較。
    • 特殊情況:String引用類型重寫了equals方法壹士,equals比較的是字面量即字符串的值磷雇。所以String的==比較堆地址,equals比較字面量躏救。

前提二:關(guān)于JVM的內(nèi)存劃分唯笙。涉及到方法區(qū)(非堆螟蒸、元空間)與堆的關(guān)系,String Pool在JDK8中從非堆移動到堆內(nèi)存中等等這些技術(shù)問題在知乎https://www.zhihu.com/question/29884421/answer/113785601@胖君的回答非常棒崩掘。

  • String Pool字符串常量池中存放的不是字面量而是堆中字符串字面量的引用七嫌。JVM會在一個String被=直接賦值時,調(diào)用equals方法比較字面量苞慢,而new String不會比較字面量诵原,直接開辟堆空間,這也是字符串的=直接賦值與new String的重要區(qū)別挽放。
  • 一旦Java源文件編譯后的類字節(jié)碼被加載進(jìn)入JVM方法區(qū)或者說元空間绍赛,類中的原始字符串常量就存在于String Pool中,運(yùn)行時只有棧中拉取相關(guān)方法時辑畦,棧中字符串變量才會依據(jù)String Pool來判斷最終指向堆內(nèi)存String字面量吗蚌,這種指向才有意義。

前提三:字符串的+相加的不同情況區(qū)分纯出。

  • 形如String combo1 = str1 + str2;這種語句是引用變量(指向堆)與引用變量(指向堆)相加蚯妇,結(jié)果必然是new String新開辟一個String堆內(nèi)存。
  • 形如String combo2 = "a" + "bc";這種語句是棧中直接執(zhí)行暂筝,結(jié)果得到一個棧中字符串變量箩言,這時候JVM會去String Pool比較字面量,如果有焕襟,則棧中字符串變量combo2指向已有的堆內(nèi)存陨收,如果沒有則開辟新空間。

實(shí)際測試結(jié)果

public class StringInJVM {
    //private static String str = "abc";
    @Test
    public void test() {
        /**
         * 基本:比較字符串的=直接賦值和new String的多次賦值
         */
        String basic1 = "basic";
        String basic2 = "basic";
        String basic3 = new String("basic");
        String basic4 = new String("basic");
        System.out.println(basic1 == basic2);   //true
        System.out.println(basic1 == basic3);   //false
        System.out.println(basic3 == basic4);   //false
        
        /**
         * 升級:比較字符串+運(yùn)算后的=內(nèi)存地址
         */
        String str = "abc";
        String str1 = "a";
        String str2 = "bc";
        String combo1 = str1 + str2;
        String combo2 = "a" + "bc";
        //棧中引用變量相加胧洒,結(jié)果直接new畏吓。如果直接字面量"a"+"bc"就不一樣
        System.out.println(str == combo1);          //false
        System.out.println(str == combo2);          //true
        System.out.println(combo1 == combo2);       //false
        System.out.println(str == combo1.intern()); //true
        System.out.println(str == combo2.intern()); //true
    
        
        /**
         * 升級
         */
        String s1 = "ABC";
        String s2 = "A" + "BC";     //棧中字面量直接相加,結(jié)果也根據(jù)字面量決定是否new堆
        String s3 = new String(s1); //new堆
        String s4 = new String("A" + "BC"); //new堆
        System.out.println(s1 == s2);   //true
        System.out.println(s1 == s3);   //false
        System.out.println(s1 == s4);   //false
        System.out.println(s2 == s3);   //false
        System.out.println(s2 == s4);   //false
        System.out.println(s3 == s4);   //false
    }
}
博客引用卫漫。本篇文章化用了兩篇博客,代碼將他們匯總使結(jié)論更加明晰肾砂。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末列赎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子镐确,更是在濱河造成了極大的恐慌包吝,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件源葫,死亡現(xiàn)場離奇詭異诗越,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)息堂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門嚷狞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來块促,“玉大人,你說我怎么就攤上這事床未〗叽洌” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵薇搁,是天一觀的道長斋扰。 經(jīng)常有香客問我,道長啃洋,這世上最難降的妖魔是什么传货? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮宏娄,結(jié)果婚禮上问裕,老公的妹妹穿的比我還像新娘。我一直安慰自己绝编,他們只是感情好僻澎,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著十饥,像睡著了一般窟勃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逗堵,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天秉氧,我揣著相機(jī)與錄音,去河邊找鬼蜒秤。 笑死汁咏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的作媚。 我是一名探鬼主播攘滩,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼纸泡!你這毒婦竟也來了漂问?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤女揭,失蹤者是張志新(化名)和其女友劉穎蚤假,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吧兔,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磷仰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了境蔼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灶平。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡伺通,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出民逼,到底是詐尸還是另有隱情泵殴,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布拼苍,位于F島的核電站笑诅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疮鲫。R本人自食惡果不足惜吆你,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俊犯。 院中可真熱鬧妇多,春花似錦、人聲如沸燕侠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绢彤。三九已至七问,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茫舶,已是汗流浹背械巡。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饶氏,地道東北人讥耗。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像疹启,于是被迫代替她去往敵國和親古程。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361