String直接賦值和new乙個物件的理解

2021-07-31 15:45:23 字數 985 閱讀 4193

我們直接來看兩句**

string str1 = new string("abc");

string str2 = "abc";

system.out.println(str1 == str2); //輸出false

首先,既然有new這個關鍵字,那麼一定要在堆記憶體中開闢空間,存放資料。所以 str1 指向的是堆記憶體中的一片區域,而str2定義了乙個字串常量,是存在於常量池的,兩者都不在乙個記憶體區域。所以輸出false。

但是這裡面還有需要注意的地方。那就是在定義str1 的時候,用new關鍵字在堆記憶體開闢乙個記憶體區域,但是同時 如果常量池裡面沒有 「abc」,那麼它也會往常量池存放「abc」。也就是說new的時候,實際是再記憶體中開闢兩個地方存放「abc」,乙個在堆記憶體上,乙個在常量池。

接著再看,

string str1 = new string("abc");

string str2 = "abc";

system.out.println(str1.intern() == str2); //輸出true

對str1加了intern方法。這個時候輸出就是true。解釋如下:

當呼叫 intern 方法時,如果池已經包含乙個等於此 string 物件的字串(該物件由 equals(object) 方法確定),則返回池中的字串。否則,將此 string 物件新增到池中,並且返回此 string 物件的引用。

它遵循對於任何兩個字串 s 和 t,當且僅當 s.equals(t) 為 true 時,s.intern() == t.intern() 才為 true。

所有字面值字串和字串賦值常量表示式都是內部的。

返回:

乙個字串,內容與此字串相同,但它保證來自字串池中。

String直接賦值和new物件的區別

string直接賦值和new物件的區別 string s hello world string s new string hello world 首先string s hello world 是賦值語句,它會先在常量池查詢是否有這個值,如果有,就將這個位址賦值給s,如果沒有就在常量池開一塊空間給he...

String直接賦值和使用new的區別

string str2 new string abc 上面語句建立了幾個字串物件?上面語句實際上建立了2個字串物件,乙個是 abc 這個直接量對應的物件,乙個是new string 構造器返回的字串物件。在jvm裡,考慮到垃圾 garbage collection 的方便,將heap 堆 劃分為三部...

委託型別定義時new和直接賦值兩種方式

public int delegate delegatefunc int a,int b public int addfunction int a,int b console.writeline a b delegatefunc functionde new delegatefunc addfunc...