亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java中字符串的不可變性

Java中字符串的不可變性

守候你守候我 2019-06-03 16:33:38
Java中字符串的不可變性考慮下面的例子。String str = new String();str  = "Hello";System.out.println(str);  //Prints Hellostr = "Help!";System.out.println(str);   //Prints Help!現在,在Java中,字符串對象是不可變的。那為什么這個物體str可以被分配值“幫助!”。這不是與Java中字符串的不可變性相矛盾嗎?有人能解釋一下不變性的確切概念嗎?編輯:好的。我現在明白了,但只有一個后續問題。那么下面的代碼呢?String str = "Mississippi"; System.out.println(str); // prints Mississippi str = str.replace("i", "!"); System.out.println(str);  // prints M!ss!ss!pp!這是否意味著再次創建兩個對象(“密西西比”和“M!SS!PP!”)以及參考str指向后面的另一個對象。replace()方法?
查看完整描述

4 回答

?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

對象str引用可以更改,但實際String物體本身不能。

這個String包含字符串的"Hello""Help!"無法改變它們的價值,因此它們是不可變的。

不變性String對象并不意味著指向對象的引用不能更改。

有一種方法可以防止str更改引用就是將其聲明為final:

final String STR = "Hello";

現在,試圖分配另一個StringSTR將導致編譯錯誤。


查看完整回答
反對 回復 2019-06-03
?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

輕巧的手柄,我建議你讀一讀杯大小-一個關于變量的故事請按值傳遞(杯號續)..這對閱讀上面的帖子有很大幫助。

你讀過嗎?是。好的。

String str = new String();

這將創建一個名為“遠程控制”的新“遠程控制”。str“并將其設置為new String()(或"").

例如,在內存中,這會產生:

str --- > ""

str  = "Hello";

這就改變了遙控器“str“但不修改原始字符串。"".

例如,在內存中,這會產生:

str -+   ""
     +-> "Hello"

str = "Help!";

這就改變了遙控器“str“但不修改原始字符串。""或遙控器當前指向的對象。

例如,在內存中,這會產生:

str -+   ""
     |   "Hello"
     +-> "Help!"


查看完整回答
反對 回復 2019-06-03
?
江戶川亂折騰

TA貢獻1851條經驗 獲得超5個贊


讓我們把它分成幾個部分


String s1 = "hello";

此語句創建包含以下內容的字符串你好并占據記憶中的空間常串池并將其分配給引用對象。沙一


String s2 = s1;

此語句分配相同的字符串。你好到新的參考S2


         __________

        |          |

s1 ---->|  hello   |<----- s2

        |__________| 

兩個引用都指向相同的字符串,因此輸出相同的值如下所示。


out.println(s1);    // o/p: hello

out.println(s2);    // o/p: hello

盡管弦是不變,則可以將任務分配到沙一將引用新值。堆疊.


s1 = "stack";    

         __________

        |          |

s1 ---->|  stack   |

        |__________|

但是關于S2對象,該對象指向你好它將是真實的。


         __________

        |          |

s2 ---->|  hello   |

        |__________|


out.println(s1);    // o/p: stack

out.println(s2);    // o/p: hello

因為字符串是不可變的Java虛擬機不允許我們修改字符串S1用它的方法。它將創建池中的所有新字符串對象,如下所示。


s1.concat(" overflow");


                 ___________________

                |                   |

s1.concat ----> |  stack overflow   |

                |___________________|


out.println(s1);    // o/p: stack

out.println(s2);    // o/p: hello

out.println(s1.concat); // o/p: stack overflow

注如果字符串是可變的,則輸出應該是


out.println(s1);    // o/p: stack overflow

現在,您可能會感到奇怪,為什么String有這樣的方法:凹()修改。下面的片段將清除您的困惑。


s1 = s1.concat(" overflow");

在這里,我們將字符串的修改后的值賦值給沙一推薦信。


         ___________________

        |                   |

s1 ---->|  stack overflow   |

        |___________________|



out.println(s1);    // o/p: stack overflow

out.println(s2);    // o/p: hello

這就是為什么Java決定字符串將成為最后一個類否則,任何人都可以修改和更改字符串的值。希望這能幫點忙。


查看完整回答
反對 回復 2019-06-03
  • 4 回答
  • 0 關注
  • 551 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號