關於String字串的比較
1.
String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1 == s2); false
原因: new String() 物件會在堆上開闢一個空間,s1指向這個地址0x1111。
再 new String()物件又會在堆上開闢一個空間,s2指向這個地址0x1112。
== 如果基本型別比較字面值,如果是引用型別比較引用地址。
false毫無疑問。
System.out.println(s1.equals(s2));
由於string重寫了equals方法(具體可看jdk原始碼),同一個物件就直接返回true,
重寫了比較string的值是否相同,相同則返回true。
2.
String s1 = "String";
String s2 = "String";
System.out.println(s1 == s2 ); true
System.out.println(s1.equals(s2)); true
為什麼這個結果?
那麼來分析一下。首先這兩個String物件都是作為一個基本型別來使用的,
而不是通過new關鍵字來建立的,因此虛擬機器不會為這兩個String物件分配新的記憶體堆,而是到String緩衝池中來尋找。
首先為s1尋找String緩衝池內是否有與"Hello"相同值的String物件存在,
此時String緩衝池內是空的,沒有相同值的String物件存在,
所以虛擬機器會在String緩衝池內建立此String物件,其動作就是new String(“String”);。
然後把此String物件的引用賦值給s1。
接著為s2尋找String緩衝池內是否有與"String"相同值的String物件存在,
此時虛擬機器找到了一個與其相同值的String物件,這個String物件其實就是為s1所建立的String物件。
既然找到了一個相同值的物件,那麼虛擬機器就不在為此建立一個新的String物件,
而是直接把存在的String物件的引用賦值給s2。
這裡既然s1和s2所引用的是同一個String物件,即自己等於自己,所以以上兩種比較方法都返回ture。
String s = new String("Hello");
s = s.intern();
以上程式碼段的功能實現可以簡單的看成如下程式碼段:
String s = "Hello";
先在堆上建立了一個物件,s.intern方法會池中建立一個物件。字串有了一個 “備份”
intern方法 返回值 jdk原始碼如此說明的。
a string that has the same contents as this string, but is
guaranteed to be from a pool of unique strings.
返回一個相同內容的字串,但是保證是池中唯一的字串。
如果你有很大的字串,裡面可能有許多重複字串,因為字元只會在快取池建立一次,相同字串就會從池中取了。
使用intern優化字串,能夠減少記憶體開銷。(只是理論分析。)
intern方法優化字串