java中String的記憶體執行過程

2021-08-28 05:33:25 字數 1159 閱讀 1971

string類建立物件的方法可以分為以下三種

string str1 = "hello";

string str2 = "he" + new string("llo");

string str3 = "he" + "llo";

system.out.println(str1 == str2);

system.out.println(str1 == str3);

輸出:false true

1.程式執行時,會先去jvm的常量池(在方法區中)中尋找有沒有「hello」 的string 物件,如果已經存在,則無須新建物件,直接把常量池中的物件位址返回給棧中的引用 str1 (此時沒有建立物件)

如果沒有存在,則在常量池中新建乙個「hello」的string物件。然後將其位址返回給棧中的引用 str1(此時建立了乙個物件)。

2.程式執行時,首先去jvm的常量池中尋找有沒有「hello」的string物件,如果有,則在堆中新建乙個string型別的物件「hello」,然後將其位址返回給棧中的引用str2。(此時只新建了乙個物件)。

如果沒有,則先在常量池中新建乙個「hello」的string物件。然後再去堆中新建乙個值為「hello」的物件,並將堆中的物件位址返回給棧中的引用str2。(此時建立了兩個物件)

那在這裡就有乙個有趣的問題,那就是常量池中的物件和堆中的物件到底是不是同乙個?可以通過比較 str1 == str2 的值可得出結論。樓主這邊得到false。可知他們並不是乙個物件。

3.第三種構造方式比較複雜。網上也是眾說紛紜。樓主在這裡分為兩種方式

3.1第一種方式是: string str1 = 「hello」; string str2 = 「he」 + 「llo」;如果是這樣,由於全是str2是由常量拼接起來的。那麼,在編譯期間就能確定值,編譯器就會在編譯期間就幫你進行拼接。那麼,編譯過後就成為:string str2 = 「hello」;之後的判斷和1一樣。且 str1 == str2 = true

3.2 string str1 = 「hello」; string str2 = 「he」; string str3 = str2 + 「llo」;

由於str3中有引用的拼接,而在編譯過程中是無法知道引用的具體值,那麼編譯器就不會預設幫你進行拼接。常量池中就要新建乙個物件。這時, str1 == str3 =false;

Java中String的記憶體空間分配

我們先舉個例子 public class test 輸出結果 false true process finished with exit code 0 我們可以看到明明是兩個一樣的字串得到的結果卻不一樣 比較兩部分的 第一部分字串是使用了new,第二部分是用賦值運算子 new是在堆區開闢了兩個記憶體...

java中string物件中的split方法的使用

我們都知道string物件中的split方法,是用來按照根據匹配給定的正規表示式來拆分此字串。split方法有兩種 一種為 public stringsplit stringregex 另一種為 public stringsplit stringregex,intlimit 但是在實際應用中我們常用...

java中string 的split函式

之前沒有在split函式 只是單純用了split regex 的方法做字串 今天遇到個人問 為什麼這個方法會導致最後的空字串消失,我一時回答不上了 就去翻看了下1.7jdk文件 在文件中我找到這樣的描述 split regex 函式是 呼叫split regex,limit 來實現的,limit 的...