我們知道建立乙個string型別的變數有以下兩種方法:
string str1 = "abc";
string str2 = new string("abc");
那麼問題來了:
string a = "abc";
string b = "abc";
string c = new string("abc");
string d = new string("abc");
system.out.println(a == b);
system.out.println(a == c);
system.out.println(a.equals(c));
system.out.println(c == d);
system.out.println(c.equals(d));
true
false
true
false
true
有沒有得出正確答案?為什麼會得出這樣的輸出,它們在記憶體中的表現形式以及比較的區別?
用equals為true很簡單,因為equals方法永遠比較的是值,而非引用。而==比較的是物件的引用,那麼a == c
和c == d
結果為false也好理解,因為用new建立的字串每次都會在jvm的堆中建立新的記憶體空間,位址當然不一樣。
而a == b
為true這個就特殊點了,要弄明白字串在記憶體中的分配才知道為什麼。
如上圖,變數a和b賦值的abc字串相當於常量,是在方法區中分配的,常量只會建立乙份。而c和d兩個變數通過new建立的,是在jvm的堆記憶體中分配的。結果一目了然。
棧 堆 方法區 常量池
存放j a在函式中定義的基本型別的變數的引用和資料,以及物件的引用都放在棧中儲存。主要存放new出來的物件和陣列。儲存已經被虛擬機器載入的類資訊 常量 靜態變數,即編譯器編譯後的 等資料。靜態變數 常量在方法區 所有方法,包括靜態和非靜態的,也在方法區。靜態常量池 靜態常量池存在於class檔案中。...
c 棧區 堆區 常量區
c 中棧區 堆區 常量區 由一道面試題目而學習 2009 04 28 21 01 include void main 對應的彙編 10 a c 1 00401067 8a 4d f1 mov cl,byte ptr ebp 0fh 0040106a 88 4d fc mov byte ptr ebp...
靜態儲存區,堆記憶體,棧空間,常量
靜態儲存區,堆記憶體,棧空間,常量區,自由儲存區,動態儲存區 2007 07 05 2 48 p.m.乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 heap stack const 字串常量通常放在data const區中 data common data code 1 棧區 由編譯器自動分...