String str="abc"和String str=new String("abc")的區別

Java運行環境有一個字符串池,由String類維護。執行語句String str="abc"時,首先查看字符串池中是否存在字符串"abc",如果存在則直接將"abc"賦給str,如果不存在則先在字符串池中新建一個字符串"abc",然後再將其賦給str。執行語句String str=new String("abc")時,不管字符串池中是否存在字符串"abc",直接新建一個字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然後將其付給str。前一語句的效率高,後一語句的效率低,因爲新建字符串佔用內存空間。String str = new String()創建了一個空字符串,與String str=new String("")相同。下面舉個例子說明:
  public class CompareString {
  public static void main(String[] args) {
   String a = new String();
   String aa = "";
   String aaa = new String("");
   String b = new String("asdf");
   String c = new String("asdf");
   String d = "asdf";
   
   System.out.println(a == aa);
   System.out.println(a == aaa);
   System.out.println(a.intern() == aa.intern());
   System.out.println(a.intern() == aaa.intern());
   System.out.println(d == "asdf");
   System.out.println(b == c);
   System.out.println(b == d);
   System.out.println(b.equals(c));
   System.out.println(b.equals(d));
   
   b = b.intern();
   System.out.println(b == c);
   System.out.println(b == d);
   c = c.intern();
   System.out.println(b == c);
  }
  }
  以上程序的運行結果爲:
  false
  false
  true
  true
  true
  false
  false
  true
  true
  false
  true
  true
  從運行結果可以驗證前面所述的內容。如果不懂String 類的intern()方法的用法可以參考jdk自帶的文檔:
  public String intern()
  Returns a canonical representation for the string object. 
  A pool of strings, initially empty, is maintained privately by the class String. 
  When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. 
  It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true. 
  All literal strings and string-valued constant expressions are interned. String literals are defined in §3.10.5 of the Java Language Specification 
  Returns: 
  a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.
  從CompareString類中我們也可以看出==與equals()的不同之處:即==比較的是兩個對象的引用(即內存地址)是否相等,而equals()比較的是兩個對象的值(即內存地址裏存放的值)是否相等。當然equals()在個別類中被重寫了那就例外了。
發佈了23 篇原創文章 · 獲贊 14 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章