大家先來看看下面這段程序:
public class Test{
public static void main(String args[])
{
String str1 = "abc";
String str = "abc;
String str2 = new String("abc");
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
System.out.println(str == str1);
}
}
這短代碼的運行結果是:
第一句println輸出的是false;而第二句則輸出的是true;但第三局卻是true;
在這裏很多人會誤認爲第一句應該是true,但事實上卻是false.因爲第一句進行"=="比較的時候比較的是兩個指向,而不是具體指向的內容。而第三句在進行“==”比較的時候同樣比較的是指向,但是他們的指向是相同的。這種現象出現的原因和字符串在內存中實例化的時候有關。
具體情況如下圖所示:
當執行第一句Str1 = "abc" 實例化出第一個指向;當進行第二句Str = "abc" 的時候出現第二個指向,因爲堆內存中存在"abc",而且str也沒有new一個新的對象,所以爲了節省內存,str指向了str1所指向的對象;但是第三句的時候出現new語句,他實例化出了一塊新的空間用來盛放"abc",自然str2的指向也也是指向這段新開闢的空間。