當我們用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()的區別:
- ==:比較引用類型比較的是地址值是否相同
- 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
