String equals 堆 常量池

2021-07-26 19:34:34 字數 986 閱讀 8053

我們知道建立乙個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 == cc == 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 棧區 由編譯器自動分...