String s new String 分析堆與棧,是先定義S,還是先new string

2023-01-29 07:45:56 字數 5813 閱讀 9698

1樓:捷睿小時

先定義s

1. string str1 = "abc";

system.out.println(str1 == "abc");

步驟:1) 棧中開闢一塊空間存放引用str1,

2) string池中開闢一塊空間,存放string常量"abc",

3) 引用str1指向池中string常量"abc",

4) str1所指代的地址即常量"abc"所在地址,輸出為true

2. string str2 = new string("abc");

system.out.println(str2 == "abc");

步驟:1) 棧中開闢一塊空間存放引用str2,

2) 堆中開闢一塊空間存放一個新建的string物件"abc",

3) 引用str2指向堆中的新建的string物件"abc",

4) str2所指代的物件地址為堆中地址,而常量"abc"地址在池中,輸出為false

3. string str3 = new string("abc");

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

步驟:1) 棧中開闢一塊空間存放引用str3,

2) 堆中開闢一塊新空間存放另外一個(不同於str2所指)新建的string物件,

3) 引用str3指向另外新建的那個string物件

4) str3和str2指向堆中不同的string物件,地址也不相同,輸出為false

4. string str4 = "a" + "b";

system.out.println(str4 == "ab");

步驟:1) 棧中開闢一塊空間存放引用str4,

2) 根據編譯器合併已知量的優化功能,池中開闢一塊空間,存放合併後的string常量"ab",

3) 引用str4指向池中常量"ab",

4) str4所指即池中常量"ab",輸出為true

5. final string s = "a";

string str5 = s + "b";

system.out.println(str5 == "ab");

步驟:同4 6. string s1 = "a";

string s2 = "b";

string str6 = s1 + s2;

system.out.println(str6 == "ab");

步驟:1) 棧中開闢一塊中間存放引用s1,s1指向池中string常量"a",

2) 棧中開闢一塊中間存放引用s2,s2指向池中string常量"b",

3) 棧中開闢一塊中間存放引用str5,

4) s1 + s2通過stringbuilder的最後一步tostring()方法還原一個新的string物件"ab",因此堆中開闢一塊空間存放此物件,

5) 引用str6指向堆中(s1 + s2)所還原的新string物件,

6) str6指向的物件在堆中,而常量"ab"在池中,輸出為false

7. string str7 = "abc".substring(0, 2);

步驟:1) 棧中開闢一塊空間存放引用str7,

2) substring()方法還原一個新的string物件"ab"(不同於str6所指),堆中開闢一塊空間存放此物件,

3) 引用str7指向堆中的新string物件,

8. string str8 = "abc".touppercase();

步驟:1) 棧中開闢一塊空間存放引用str6,

2) touppercase()方法還原一個新的string物件"abc",池中並未開闢新的空間存放string常量"abc",

3) 引用str8指向堆中的新string物件

2樓:

說實話,很無聊的問題~~

執行string s=new string後,哪個結論是正確的

string s = "abc" 與 string s = new string("abc") 有什麼區別?

3樓:

string s = "abc" :s是儲存在棧裡。

先在棧中建立一個對string類的物件引用變數s,然後查詢棧中有沒有存放"abc",如果沒有,則將"abc"存放進棧,並令s指向」abc」,如果已經有」abc」 則直接令s指向「abc」。例子如下:

string s1 = "abc";

string s2 = "abc";

system.out.println(s1==s2); //true

說明s1和s2指向同一個物件

string s = new string("abc") : s是儲存在堆裡。

每呼叫一次就會建立一個新的物件。 例子如下:

string s1 =new string ("abc");

string s2 =new string ("abc");

system.out.println(s1==s2); // false

說明s1和s2是不指向同一個物件的

4樓:匿名使用者

string s="abc" 中的s是實體,其值就是"abc",而string s=new string("abc")中的s是string類的一個物件,我想可以這麼說吧,s就是指向「abc」的指標,其值就是"abc"的值

5樓:匿名使用者

string s = "abc"是在物件池中拿物件;

string s = new string("abc") 是建立新物件;

j**a裡,string s;和new string( );有什麼區別嗎

6樓:b鋒

string是一個特殊的包裝類資料。可以用:

string str = new string("abc");

string str = "abc";

兩種的形式來建立,第一種是用new()來新建物件的,它會在存放於堆中。每呼叫一次就會建立一個新的物件。而第二種是先在棧中建立一個對string類的物件引用變數str,然後查詢棧中有沒有存放"abc",如果沒有,則將"abc"存放進棧,並令str指向」abc」,如果已經有」abc」 則直接令str指向「abc」。

比較類裡面的數值是否相等時,用equals()方法;當測試兩個包裝類的引用是否指向同一個物件時,用==,下面用例子說明上面的理論。

string str1 = "abc";

string str2 = "abc";

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

可以看出str1和str2是指向同一個物件的。

string str1 =new string ("abc");

string str2 =new string ("abc");

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

用new的方式是生成不同的物件。每一次生成一個。

因此用第二種方式建立多個」abc」字串,在記憶體中其實只存在一個物件而已. 這種寫法有利與節省記憶體空間. 同時它可以在一定程度上提高程式的執行速度,因為jvm會自動根據棧中資料的實際情況來決定是否有必要建立新物件。

而對於string str = new string("abc");的**,則一概在堆中建立新物件,而不管其字串值是否相等,是否有必要建立新物件,從而加重了程式的負擔。

7樓:匿名使用者

string s = "1",

new string("1");

除了記憶體分配不同外還有一點:對於 string s = "1",如果棧記憶體中已經有個string,他的值也正好是 「1」,那麼 s 會直接指向已有的那個,而不會新分配棧記憶體。

而對於 new string("1"),無論如何都會重新分配一個堆區間去存放他。

8樓:夢巜人生

當然有區別

string s="1";

s是儲存在棧裡

new string("1");

s是儲存在堆裡

關於堆很棧的區別看下這篇文章

9樓:

沒有太大的區別。

都是在記憶體中儲存了1,但是上面的同時還儲存了變數名

10樓:匿名使用者

堆疊中會有一些區別吧

string s="1";

這個先在堆中建立s 然後在棧裡建立一個空間存放1,再將s指向1new string("1");

這個是在棧裡建立一個空間存放1,而沒有在堆中進行關聯好像是這個

11樓:不發蓬的水稻

都是在記憶體中儲存了1,但是上面的同時還儲存了變數名string s="1";

s是儲存在棧裡

new string("1");

s是儲存在堆裡

12樓:匿名使用者

string s="1";定義一個名為s值為『1』的string型物件

new string("1");新建一個值為『1』的string型物件

string s = new string("xyz");建立了幾個string object?

13樓:匿名使用者

2個如果講堆疊,估計你也難懂

這樣說吧,就是如果記憶體中沒有「xyz」,那麼新建一個字串「xyz」,然後以之為模板(比喻),在分配一個記憶體,內容和「xyz」一樣。

比如說:

string s1 = new string("xyz");

string s2 = new string("xyz");(已存在模板,不再建立xyz)

那麼應該就是建立3個物件,而不是4個

14樓:

兩個 一個是string 型別的引用 就是string s;另一個是新的string型別的字串,就是new string("xyz")

15樓:乁

"xyz"為常量池中的一個

s指向的物件為堆裡的一個

string s = new string("xyz"); 為什麼建立了2個string object?

16樓:time飛啊飛的

string s = new string("xyz");

建立兩個物件

第一個 new的時候 會在堆生成一個物件第二個 當成引數傳入的"xyz"會在常量池生成一個物件 以後用 string x="xyz" 之類的新的變數都會引用常量池的xyz

所以是生成兩個物件

j**a裡string str = new string("ss")建立了幾個物件?為什麼?分別是那些物件?在記憶體的分配如何?

17樓:

樓上的回答不盡準確。。

只建立了一個物件,在堆中分配了一塊記憶體,儲存的是「ss」這個字串的值,然後在棧中有一個記憶體儲存的是堆裡面「ss」這個字串的引用str。也就是說,棧中str是一個引用,指向堆中「ss」這個字串的地址。

18樓:匿名使用者

建立了兩物件,new string建立了一個物件, 用new string建立物件使用的是另一個物件,也就是"ss"也是一個string物件,然後返回引用

19樓:殘夜戀雨

兩個 , 一個是『ss』,另一個是』ss『的引用地址 即str

什麼是堆和棧?函式壓棧是怎麼回事

什麼是堆和棧?一個由c c 編譯的程式佔用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,...

多執行緒中棧與堆是公有的還是私有的

棧是私有的,每個執行緒都有自己的棧。堆是公有的,同一程序中的不同執行緒可以通過堆共享資料。多執行緒中棧與堆是公有的還是私有的 每個執行緒私有的資源只有的棧和程式計數器 棧記憶體用來記錄執行緒的執行歷史 程式計數器用來儲存執行緒的執行位置,其他的資源 比如 檔案控制代碼 全域性變數 堆記憶體 都是所有...

什麼是定向分析和定量分析,什麼是定性分析與定量分析?

定性分析是指憑分析者的直覺 經驗,憑分析物件過去和現在的延續狀況及最新的資訊資料,對分析物件的性質 特點 發展變化規律作出判斷的一種方法。定量分析是指依據統計資料,建立數學模型,並用數學模型計算出分析物件的各項指標及其數值的一種方法。定性分析是定量分析的基礎,是它的指南和歸結。定量分析是定性分析的手...