關(guān)于String a = "AA";和String b = new String("AA");的區(qū)別


先說幾個概念吧

1.常量池

指的是在編譯期確定,并被保存在已編譯的字節(jié)碼文件中的一些數(shù)據(jù),它包括類、方法、接口等中的常量,也包括字符串常量。

2.==: 比較是否是同一個對象

3.equals(): 比較的是對象里的內(nèi)容


下面我開始說區(qū)別

第1種:
String a="abc"; String b="abc"; System.out.print(a==b);
結(jié)果:true

原因:編譯時,這兩個"abc"被認(rèn)為是同一個對象保存到了常量池中;運行時JVM則認(rèn)為這兩個變量賦的是同一個對象,所以返回true。


第2種:
String a=new String("abc"); String b=new String("abc"); System.out.print(a==b);
結(jié)果:false

原因:用構(gòu)造器創(chuàng)建的對象,是不會被放入常理池中的,也很明顯這完全是兩個對象,只是內(nèi)容相同罷了,結(jié)果當(dāng)然為false了。用equals()或者System.out.print(a.intern()==b.intern());就返回true了。


第3種
String a="abc"; String b=new String("abc"); System.out.print(a==b);
結(jié)果:false

原因:同上


第4種
String a="abcdef"; System.out.print(a=="abcdef");
結(jié)果:true

原因:運行出現(xiàn)的字符串常量,若是在常量池中出現(xiàn)過,則JVM會認(rèn)為同一個對象,以節(jié)省內(nèi)存開銷,所以這兩個字符串會被認(rèn)為是同一個對象。


第5種
String a="abcdef"; String b=""; String c=a+b; System.out.print(c=="abcdef");
結(jié)果:false

原因:編譯時,先將"abcedf"放在常量池中,而c的值則是在運行時在堆里創(chuàng)建的。所以為false。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,734評論 18 399
  • 在編寫程序的過程中,不了避免的要用到字符串,所以String類的常用方法的用法是必須掌握的。學(xué)習(xí)一個類的使用方法最...
    Geg_Wuz閱讀 1,497評論 0 4
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,656評論 0 3
  • final關(guān)鍵字(最終) final修飾的類無法被繼承. final修飾的方法無法被覆蓋. final修飾的局部變...
    yangliangliang閱讀 733評論 0 0
  • 猛地想一股腦扎進(jìn)池水 忘卻一切 那個我 在哪?
    二叔Sltsun閱讀 298評論 0 4

友情鏈接更多精彩內(nèi)容