Posted on 2011-07-21 10:24
ChunPIG 閱讀(188)
評論(0) 編輯 收藏
今天在iteye看到一個關于常量池與new 對象的問題。于是便有了這篇小筆記。
請看代碼:
public class StrTest {
public static void main(String[] args) {
String str1 = new String("test");
String str2 = "test";
String str3 = "test";
System.out.println("str1 == str2 : " + (str1 == str2));
System.out.println("str1.equals(str2):" + str1.equals(str2));
System.out.println("str2== str3 : " + (str2 == st3));
}
}
輸出結果如下:
str == str1 : false
str.equals(str1):true
str1 == str2 : true
起初,咋一看覺得很詫異。后來多看了一眼便明白了。這起始是涉及到New關鍵與”=“賦值的區別,以及equals關鍵與比較符=的區別。
首先,就new與=,談點個人的認識。通過new出來的對象,通常是存在堆里面。而通過=賦值的對象通常存在常量池中。
由此可以證明:上面代碼str1==str2的結果為false,而str2==str3結果是true。
str1與str2的值雖然一樣,但是存放在位置不一樣,所以對象所指的地址也就不一樣。
然后=在比較的時候,一般情況下都是比較地址。
從而也就引出了下一個問題:
比較符==與equals的區別。
==對于兩個變量則是比較值,對于引用類型變量則是兩個變量在堆中存儲的地址是否相同。
而equals則是對兩個變量是否是對同一個對象的引用,也就是在堆中的內容是否相同。
由此也可證明:str1.equals(str2)的結果是true。
這是本人作為Java菜鳥的一點點看法。歡迎各位老鳥拍磚。