String: 不可改變的Unicode字符序列
池化思想,把需要共享的數據放在池中,用一個存儲區域來存放一些公用資源 以減少存儲空間的開銷。
在String類中,以字面值創建時,會到Java方法空間的串池中去查找,如果沒有則會在串池里創建一個字符串對象,並返回其地址賦給對象變量,如果有就返回串池中字符串的地址,並把這個地址賦給對象變量。
如果是new,則會在堆空間中創建String類的對象,不會有上述的過程
如:
String s1 = "abc"; //新創建,字符串常量池中沒有該串,則會在池中創建一個串"abc"
String s2 = "abc"; //串池中已經存在"abc",則s2會去指向"abc"而不會去創建一個新的
String s3 = new String("abc"); //直接在堆中去開辟一個新的空間,而不會去池中查找
類中的具體方法查看下Api文檔。
調用任何String中的方法,不會改變String自身,除非重新賦值。
StringBuffer: 可改變的Unicode字符序列
允許並發操作,是線程安全的
String類在進行字符串連接時會顯得效率很低,就是因為它所產生的對象的屬性是不能夠修改的,當連接字符串時也就只能創建新的對象。
對於很多字符串連接時,應當使用StringBuffer類,使用這個類的對象來進行字符串連接時就不會有多余的中間對象生成,從而優化了效率。
例:對於字符串連接String str = "A" + "B" + "C" + "D";
產生:"AB"、"ABC"、"ABCD"
在串池中產生的"AB"、"ABC"明顯是多余對象,浪費空間。
解決方案:
String s = null;
StringBuffer sb = new StringBuffer("A");
sb.append("B");
sb.append("C");
sb.append("D");
s = sb.toString();
StringBulder: 可改變的Unicode字符序列
操作同StringBuffer,只是不支持並發操作,非線程安全的