可變物件和不可變物件的差異
在 Java 中,不可變物件的 狀態 在建立後不能被修改,但可以引用其他物件。它們在多執行緒環境中非常有用,因為多個執行緒無法更改物件的狀態,因此不可變物件是執行緒安全的。不可變物件非常有助於避免時間耦合,並且始終具有故障原子性,並且在多執行緒中也很有用。為什麼呢?因為沒有人可以更改物件,對吧?所以,它變得執行緒安全,這意味著當程式的不同部分嘗試訪問該特定物件時,它不會導致任何意外問題。
另一方面,我們有可變物件,我們可以在任何狀態下更改它們。它們欄位可以在建立後更改。但正因為如此,它們不是執行緒安全的,在多執行緒程式中使用它們時,我們需要格外小心。
現在,讓我們詳細瞭解一下這兩者之間的區別。
可變物件與不可變物件
| 關鍵 | 可變物件 | 不可變物件 |
|---|---|---|
| 基本概念 | 我們可以在建立可變物件後修改其狀態。例如,如果我們建立一個名為筆記型電腦的物件,帶有品牌名稱(如戴爾),然後更新品牌名稱(如惠普)。 | 一旦建立了不可變物件,其狀態就會被鎖定,我們無法更改它。如果我們稍後需要設定不同的內容,則無需更改特定欄位,而是需要建立一個新物件。 |
| 執行緒安全 | 可變物件不是執行緒安全的,這意味著如果多個執行緒同時嘗試訪問或修改該物件,可能會導致問題,因此我們需要提前注意它。 | 不可變物件是執行緒安全的。因為我們在建立後無法更改其狀態,所以不同的執行緒可以訪問該物件而不會出現任何干擾或意外行為。 |
| 最終類 | 可變類不需要是最終類。它可以透過其他子類擴充套件,並且其行為可以透過子類修改。 | 要建立不可變物件,請將類設為final。這可以防止任何人建立可能修改類行為並使其可變的子類。 |
| 示例 | 預設情況下,所有類及其物件本質上都是可變的。像ArrayList和HashMap這樣的類允許在建立後更改其內容,這使得它們本質上是可變的。 | 在 Java 中,像String和包裝類(如Integer和Boolean)這樣的類是不可變類的示例。一旦建立,它們的狀態以後就不能修改。 |
不可變類的示例
public final class ImmutableClass {
private final String laptop;
public ImmutableClass(String laptop) {
this.laptop = laptop;
}
public String getLaptop() {
return laptop;
}
}
public class Main {
public static void main(String[] args) {
ImmutableClass immutableClass = new ImmutableClass("Dell");
System.out.println(immutableClass.getLaptop());
}
}
輸出
Dell
可變類的示例
public class MutableClass {
private String laptop;
public MutableClass(String laptop) {
this.laptop = laptop;
}
public String getLaptop() {
return laptop;
}
public void setLaptop(String laptop) {
this.laptop = laptop;
}
}
public class Main {
public static void main(String[] args) {
MutableClass mutableClass = new MutableClass("Dell");
System.out.println(mutableClass.getLaptop());
mutableClass.setLaptop("IBM");
System.out.println(mutableClass.getLaptop());
}
}
輸出
Dell IBM
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP