String類概述
String 類被final修飾,無子類璃氢,不可被復寫哟玷,對String類的任何改變,都會返回一個新的String類對象一也。
什么是不可變對象巢寡,有什么好處
不可變對象是指一個對象的狀態(tài)在對象創(chuàng)建之后就不再變化(一旦被創(chuàng)建,就不能修改它的值)椰苟。
創(chuàng)建一個不可變對象
- 將類聲明為final,不能被繼承抑月;
- 所有成員聲明為私有,不允許直接訪問這些成員舆蝴;
- 對變量不提供setter方法谦絮;
- 所有可變的成員聲明為final,只能對它們賦值一次题诵;
- 通過構(gòu)造器初始化所有成員,進行深拷貝层皱;
- 再getter方法中性锭,不直接返回對象本身,而是克隆對象奶甘,并返回對象的拷貝篷店;
String類源碼
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
//other codes
}
不可變對象好處
- 不可變對象容易構(gòu)造,效率高臭家;
- 線程安全疲陕;
- 容易緩存,避免null的引用钉赁;
- 避免時間的耦合蹄殃;
從性能和安全倆個方面說為什么String類不可變的
- 安全
引發(fā)的安全問題:程序中的用戶姓名、密碼你踩、數(shù)據(jù)庫信息诅岩、URL、IP等等都是以String形式傳入带膜,因此它的值是不可變的吩谦,改變引用的值會造成安全漏洞;
線程安全:再多線程并發(fā)情況下膝藕,多個線程同時讀寫資源式廷,會引起競爭問題,由于String是不可變的芭挽,不會引發(fā)線程問題滑废;
HashCode:也就源碼中的hash,當String被創(chuàng)建出來,hashcode也會被隨之存儲袜爪,hashcode的計算和value有關(guān)蠕趁,如果String可變,那hashcode也會隨之改變辛馆,針對Map俺陋、Set等容器,需要保持鍵值的唯一性和一致性,所以String更適合容器的鍵值; - 性能
當字符串是不可變的時候航棱,字符串常量池才有意義。字符串常量池的出現(xiàn)寿酌,減少創(chuàng)建相同的字面量的字符串,讓不同的引用指向同一個字符串硕蛹,為運行時節(jié)省很多堆內(nèi)存醇疼。若字符串可變硕并,字符串常量池將失去意義,每次創(chuàng)建新的String,都將開辟新的空間秧荆,占據(jù)更多內(nèi)存倔毙;
總結(jié)
其實String類不可變的特性應用無處不在,這里從性能和安全倆個方面主要分析乙濒,也是代碼中最常涉及到的陕赃。如果有不同的思考,歡迎交流學習颁股。