String與字串池

yuan22003發表於2011-08-27
public class StringInternTest {  

  public static void main(String[] args) {  

  // 使用char 陣列來初始化a,避免在a 被建立之前字串池中已經存在了值  
為"abcd"的物件  

  String a = new String(new char[] { 'a', 'b', 'c', 'd' });  

  String b = a.intern();  

  if (b == a) {  

  System.out.println("b 被加入了字串池中,沒有新建物件");  

  } else {  

  System.out.println("b 沒被加入字串池中,新建了物件");  

  }  

  }  

}  
b 沒被加入字串池中,新建了物件


字串池和String類的基本關係:
  Java執行環境有一個字串池,由String類維護。
  1、執行語句String str="abc"時,首先檢視字串池中是否存在字串"abc",如果存在則直接將"abc"賦給str,如果不存在則先在字串池中新建一個字串"abc",然後再將其賦給str。
  2、執行語句String str=new String("abc")時,不管字串池中是否存在字串"abc",直接新建一個字串"abc"(注意:新建的字串"abc"不是在字串池中),然後將其付給str。
  3、當呼叫 intern 方法時,如果池已經包含一個等於此 String 物件的字串(用 equals(Object) 方法確定),則返回池中的字串。否則,將此 String 物件新增到池中,並返回此 String 物件的引用。
   
  String a = new String(new char[] { 'a', 'b', 'c', 'd' }); 這個就是第二種情況了,此時字串a不在字串池中,String b = a.intern(); 因為a不在字串池中,所以在執行a.intern()時,會把a新增在池中,然後返回a的引用,所以b的值就是a的引用,所以a不等於b。

它遵循以下規則:對於任意兩個字串 st,當且僅當 s.equals(t)true 時,s.intern() == t.intern() 才為 true


String a = new String(new char[] { 'a', 'b', 'c', 'd' });  
        System.out.println(a=="abcd");

---false

String a = new String(new char[] { 'a', 'b', 'c', 'd' });  
        String b = a.intern();
        System.out.println(b=="abcd");

---true



相關文章