1. 程式人生 > >Java基礎-----為什麼String是不可變的

Java基礎-----為什麼String是不可變的

轉發:https://blog.csdn.net/qq_36632687/article/details/79655030

為什麼String是不可變的

String所有屬性都被final修飾、私有的並且沒有提供修改方法。 (主要欄位是char陣列,雖然被final修飾但陣列是可變的,私有保證了不被修改但還是可以通過反射來改變String)

為什麼String設計成final

避免被繼承後破壞,防止方法被重寫。

為什麼String設計成不可變的

1、字串常量池的需要,提升效率和減少記憶體分配。
2、安全性考慮,防止被意外修改(HashSet中存的值如果是可變的String,則破壞了唯一性;不可被寫所以執行緒安全;)。
3、作為HashMap、HashTable等hash型資料key的必要。因為不可變的設計,jvm底層很容易在快取String物件的時候快取其hashcode,這樣在執行效率上會大大提升。

建立變數

1、顯式的String常量
String a = “test”;
在常量池中建立了String物件,若存在則不建立返回相同物件
2、String物件
String a = new String(“test”);
Class被載入時就在常量池建立了String物件(若有就不建立),執行時在堆中建立String物件。

intern()方法

intern用來返回常量池中的某字串,如果常量池中已經存在該字串,則直接返回常量池中該物件的引用。否則,在常量池中加入該物件,然後返回引用。

推薦閱讀:
Java-String.intern的深入研究:https://www.cnblogs.com/Kidezyq/p/8040338.html


Java中字串記憶體位置淺析:https://www.cnblogs.com/holten/p/5782596.html
Java中的String為什麼是不可變的? – String原始碼分析:https://blog.csdn.net/zhangjg_blog/article/details/18319521
請別再拿“String s = new String(“xyz”);建立了多少個String例項”來面試了吧:http://rednaxelafx.iteye.com/blog/774673