簡體   English   中英

Java中字符串不可變的概念

[英]Concept of Immutability of String in Java

我知道原因,為什么String是不可變的,但是我的問題是為什么不變性的概念僅堅持java中的String類,為什么它不適用於其他人。

我發現它為什么不可變的原因之一是在這里

但是,為什么不是所有其他類(例如Integer等)呢?。Java人們如何決定更改其值可能不會生效..

請解釋 。

關鍵是您可以將字符串(是對象)與原始類型混淆。 實際上,字符串通常在Java程序中出現的方式會引起混亂。 對於Java中的其他對象而言,有些字符串無法使用的快捷方式。 這些快捷方式得到了廣泛使用,它們使字符串具有原始數據類型的外觀。 但是,字符串是對象,它們擁有Java中對象的所有屬性和行為。

在設計類時,使其不可變是一種設計選擇,通常是一種折衷方案。 由於許多原因,包括安全性,使String和Integer類不可變。

諸如java.util.Random之類的類都是關於管理某種狀態的,因此它必須是可變的。

諸如java.awt.Rectangle之類的類是可變的,當您修改一個而不是創建一個新的類時,它具有節省內存管理成本的優點,但是不幸的是,這意味着當一個Rectangle實例被共享時(例如,由兩個不同的窗口對象共享) ,對其中一個進行更改會使其從其他狀態更改為其他狀態,從而導致不愉快的意外。 現代垃圾收集器非常高效[我聽說它們比C的malloc()free()更高效],因此可變性實際上可能不會節省內存管理開銷,如果您經常必須復制對象以防止意外的共享更改,則肯定不會這樣。

您可以自由共享一個不變的對象,而不必擔心它會從您身下變出來。

整數是不可變的,因此對其進行的每個操作都會創建一個新實例。

不可變並不意味着參照不能分配其他值。 例如,String也是不可變的,但是我們可以這樣做:

String ex = "good";    // ex == "good"
ex = ex + "morning";    // now ex == "goodmorning"

那么那里發生了什么? 由於String是不可變的,因此顯然“ ex”沒有更改。 但是現在分配了一些不同的東西。 這是因為“ ex”現在是一個完全新實例化的對象。

因此,與Integer相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM