java String類

java String類是final類,不可變類,一旦建立就不會發生變化,內部由char數組實現。java

java程序運行時,內存分爲Stuck(棧區),Heap(堆區),Data(數據區)和代碼區。其中數據區用來存放靜態變量和字符串常量。數組

String s = "abc";
String s = new String("abc");

第一種先在棧中建立一個對String類的對象引用變量s,JVM爲了提升性能和減小內存開銷,內部維護了一個字符串常量池,每當建立字符串常量時,JVM首先檢查字符串常量池,若是常量池中已經存在,則返回池中的字符串對象引用,不然建立該字符串對象並放入池中,最後將s指向這個對象的地址。安全

String a = "abc";
String b = "abc";
System.out.print(a == b); //true
System.out.print(a.equals(b));//true

但與建立字符串常量方式不一樣的是,當使用第二種new String(String str)方式等建立字符串對象時,無論字符串常量池中是否有與此相同內容的字符串,都會在堆內存中建立新的字符串對象。app

String a = "Hello";
String b = new String("Hello");
System.out.println(a == b);  //false
System.out.println(a.equals(b)); //true

即便字符串內容相同,字符串常量池中的字符串與經過new String(..)等方式建立的字符串對象之間沒有直接的關係,可是,能夠經過字符串的intern()方法找到此種關聯。intern()方法返回字符串對象在字符串常量池中的對象引用,若字符串常量池中還沒有有此字符串,則建立一新的字符串常量放置於池中。性能

String a = "Hello";
System.out.println(a == a.intern()); //true

String b = new String("corn");
String c = b.intern();

System.out.println(b == c); //false

String d = "corn";

System.out.println(c == d); //true

String/StringBuilder/StringBuffer區別
String是不可變字符串對象,StringBuilder和StringBuffer是可變字符串對象(其內部的字符數組長度可變),StringBuffer線程安全,StringBuilder非線程安全。ui

字符串鏈接線程

String中使用 + 字符串鏈接符進行字符串鏈接時,字符串鏈接是從左向右依次進行,對於不一樣的字符串,首先以最左邊的字符串爲參數建立StringBuilder對象,而後依次對右邊進行append操做,最後將StringBuilder對象經過toString()方法轉換成String對象(注意:中間的多個字符串常量不會自動拼接)。code

也就是說
String c = "xx" + "yy " + a + "zz" + "mm" + b; 實質上的實現過程是: String c = new StringBuilder("xxyy").append(a).append("zz").append("mm").append(b).toString();
因爲得出結論:當使用+進行多個字符串鏈接時,其實是產生了一個StringBuilder對象和一個String對象。對象

相關文章
相關標籤/搜索