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