今天學習了一下String的源碼。下面是個人學習感悟。java
1.web
String str = "ABC"; Char[] data = {'A','B','C'}; String str = new String(data);
這兩個是同樣的。也就是說:String的底層就是字符的數組。數組
2.緩存
java提供了特殊的運算符'+',這個運算符能夠用來將兩個String類型的字符串相加得到新的字符串。安全
String str1 = "AAA"; String str2 = "BBB'; String str = str1 + str2;
實際上,這個是將str1變成了stringBuilder1,str2變成了stringBuilder2,而後運行stringBuilder = stringBuilder1.append(stringBuilder2),得到的結果爲stringBuilder.toString();就變成了str。app
3.學習
public final class String implements Serializable,Comparable,CharSequence{ }
這個是源碼的第一行,定義了String類是個final類,它不能被任何的類繼承,同時String類實現了Serializable、Comparable、CharSequence接口。這就意味着String類裏面有這三個接口聲明的方法。ui
4.spa
屬性: private final char value[];
經過final來看,咱們知道,String一旦被初始化,就不能被更改線程
第二個屬性: private int hash;
緩存的字符穿hashCode 默認爲0
第三個屬性:
private static final long serialVersionUID = -6849794470754667710L; private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];
String 擁有序列化和反序列化的功能,這個功是實現了Serializable接口的,
5.
StringBuffer和StringBuilder的功能差很少,只不過StringBuilder更快,而StringBuffer更安全。
官方文檔是說StringBuffer的toString方法是同步的,犧牲了效率保證了線程的安全。
6.
其它方法:
7.
public native String intern();
native的意思是生成動態連接庫文件,能夠更快速的訪問。
intern()方法是返回一個字符串對象的內部引用,當intern()被調用的時候,會先在常量池中尋找,若是常量池中有這樣一個相等的字符串,則返回常量池中的實例,反之則在常量池中建立字符串,而後返回這個字符串的引用
8.
int i = 5; String i1 = ""+i; String i2 = String.valueOf(i); String i3 = Integer.toString(i);
第三行的底層也是按照第四層來執行的。意思就是說第三層和第四層是同樣的。而第二層則是先建立一個StringBuilder,在執行stringBuilder.append(i),再調用toString()方法