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 注意它與資料結構中的堆是兩回事,...
多執行緒中棧與堆是公有的還是私有的
棧是私有的,每個執行緒都有自己的棧。堆是公有的,同一程序中的不同執行緒可以通過堆共享資料。多執行緒中棧與堆是公有的還是私有的 每個執行緒私有的資源只有的棧和程式計數器 棧記憶體用來記錄執行緒的執行歷史 程式計數器用來儲存執行緒的執行位置,其他的資源 比如 檔案控制代碼 全域性變數 堆記憶體 都是所有...
什麼是定向分析和定量分析,什麼是定性分析與定量分析?
定性分析是指憑分析者的直覺 經驗,憑分析物件過去和現在的延續狀況及最新的資訊資料,對分析物件的性質 特點 發展變化規律作出判斷的一種方法。定量分析是指依據統計資料,建立數學模型,並用數學模型計算出分析物件的各項指標及其數值的一種方法。定性分析是定量分析的基礎,是它的指南和歸結。定量分析是定性分析的手...