String str=new String("a")和String str = "a"有什么區別?


當我們用String str = 'str'時,會先到內存中找有沒有'str'這個對象,如果沒有就new String('str');如果有那么就用str指向該對象就可以了。
用String str = new String('str')時會直接在內存中new一個'str'對象,不管內存中有沒有。如果內存中已經有'str'這個對象了,那么就存在兩個。

 

延伸問題:

String A="ABC";

String B=new String("ABC");

這兩個值,A,B 是否相等,如果都往HashSet里面放,能放下嗎?

答:(a)A==B 的判斷為false;

         (b)A.equals(B)為true ;因為值相等,所以都往HashSet里面放不下,只能放一個 

 問題:==與equals()的區別:

  1. ==:比較引用類型比較的是地址值是否相同
  2. equals:比較引用類型默認也是比較地址值是否相同,注意:String類重寫了equals()方法,比較的是內容是否相同。

String A = "ABC";內存會去查找永久代(常量池) ,如果沒有的話,在永久代中中開辟一塊兒內存空間,把地址付給棧指針,如果已經有了"ABC"的內存,直接把地址賦給棧指針;

因此

String str1="aa";

Srting str2="aa";

String Str3="aa";

....

這樣下去,str1==Str2==str3;會一直相等下去,(a) ==的判斷, (b) equals()的判斷;都相等,因為他們的地址都相等,因此只在常量池中有一份內存空間,地址全部相同; 

  而String str = new String("a");是根據"a"這個String對象再次構造一個String對象;在堆中從新new一塊兒內存,把指針賦給棧,

將新構造出來的String對象的引用賦給str。 因此 只要是new String(),則,棧中的地址都是指向最新的new出來的堆中的地址,

(a)“”==“” 是判斷地址的,當然不相同;

(b)至於equals,String類型重寫了 equals()方法,判斷值是否相等,明顯相等,因此 equals 是相等的;

 

參考鏈接:https://www.cnblogs.com/aspirant/p/9193112.html

        https://www.cnblogs.com/aademeng/articles/10870164.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM