1. 程式人生 > >為什麼String在Java中是不可變的或final

為什麼String在Java中是不可變的或final

字串在Java中是不可變的,因為String物件快取在String池中。由於快取的字串文字在多個客戶端之間共享,因此始終存在風險,其中一個客戶端的操作會影響所有其他客戶端。例如,如果一個客戶端將字串“Test”的值更改為“TEST”,則所有其他客戶端也將看到該值,如第一個示例中所述。由於String物件的快取從效能原因很重要,因此通過使String類不可變來避免這種風險。同時,String是最終的,所以沒有人可以犧牲String類的不變數,例如 通過擴充套件和覆蓋行為來實現不變性,快取,雜湊碼計算等。String類不可變的另一個原因可能是由於HashMap而導致的。

由於字串作為HashMap鍵很受歡迎,因此它們必須是不可變的,以便它們可以檢索儲存在HashMap中的值物件。由於HashMap依據雜湊原理工作,因此需要具有相同的值才能正常執行。如果在插入後String的內容被修改,易變的String將在插入和檢索時生成兩個不同的雜湊碼,可能會丟失對映中的值物件。

如果你是印度板球迷,你可以理解下一句話。 該字串是Java的VVS Laxman(印度著名的板球手),即非常特殊的類。 我還沒有看到一個沒有使用String編寫的Java程式。 這就是為什麼對String的充分理解對於Java開發人員來說非常重要。

String作為資料型別,傳輸物件和調解器非常重要和普及,這也使其在Java面試中流行。為什麼String在Java中是不可變的是Java中最常被問到的String Interview問題之一,它首先討論了什麼是String,Java中的String與C和C ++中的String有何不同,然後轉向什麼是不可變物件在Java中,不可變物件有什麼好處,為什麼要使用它們以及應該使用哪些場景。有時也會問這個問題:“為什麼String在Java中是最終的”。

Why String is Final in Java

正如我所說,這個問題可能有很多可能的答案,String類的唯一設計者可以自信地回答這個問題。我在Joshua Bloch的Effective Java書中期待一些線索,但他也沒有提到它。1)想象一下字串池設施使字串可變,其實這根本不可能,因為在字串池的情況下,一個字串物件/文字,例如“Test”已被許多參考變數引用,因此如果其中任何一個改變了值,則其他引數將自動受到影響,即可以說:
String A = “Test”
String B = “Test”
現在String B呼叫了“Test”.toUpperCase(),它將同一個物件改為“TEST”,所以A也將是“TEST”,這是不可能的。這是一個很好的圖表,顯示了字串文字如何在堆記憶體和字串文字池中建立。
這裡寫圖片描述

2)字串已被廣泛用作許多Java類的引數,例如對於開啟網路連線,您可以將主機名和埠號作為字串傳遞,您可以將資料庫URL作為字串傳遞以開啟資料庫連線,您可以通過將檔名作為引數傳遞給File I / O類來開啟Java中的任何檔案。

如果String是可變的,這將導致嚴重的安全威脅,我的意思是有人可以訪問他有權授權的任何檔案,然後可以故意或意外地更改檔名並獲得對該檔案的訪問許可權。由於不變性,您無需擔心這種威脅。這個情況也說明了,為什麼String在Java中是final,通過使java.lang.String final,Java設計者確保沒有人覆蓋String類的任何行為。

3)由於String是不可變的,因此它可以安全地在多執行緒之間共享,這對於多執行緒程式設計非常重要,並且為了避免Java中的任何同步問題,Immutability也使得Java例項在Java中是執行緒安全的,這意味著您不需要在外部同步String操作。關於String的另一個重要注意事項是由SubString引起的記憶體洩漏,這不是與執行緒相關的問題,而是需要注意的事項。
4)Why為什麼String在Java中是不可變的另一個原因是允許String快取其雜湊碼,Java中的不可變String快取其雜湊碼,並且每次呼叫String的hashcode方法時都不計算,這使得它作為hashmap鍵非常快用於Java中的hashmap。 Jaroslav Sedlacek在下面的評論中也提出了這一點。簡而言之,因為String是不可變的,所以沒有人可以在建立後更改其內容,這保證了String的hashCode在多次呼叫時是相同的。

5)Dan Bergh Johnsson在評論中提出的為什麼String是不可變的另一個好理由是:String是不可變的絕對最重要的原因是它被類載入機制使用,因此在安全方面極具意義。如果String是可變的,載入“java.io.Writer”的請求可能已被更改為載入“mil.vogoon.DiskErasingWriter”

進階讀物:
Data Structures and Algorithms: Deep Dive Using Java
Java Fundamentals: The Java Language
Complete Java Masterclass
How substring works in Java
How to replace String in java using regular expression
Why Character array is better than String for storing password in Java
How to convert String into Integer in Java
How to split String with 2 examples in Java
How to compare String in Java