歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java中的字符串(String)的秘密

Java中的字符串(String)的秘密

日期:2017/3/1 10:25:25   编辑:Linux編程

Java中的"=="的作用是用來判斷兩個數據是否相等,無論是8種原生數據類型還是引用類型,引用類型相等也就是指兩個引用指向同一個對象,Object類中的equals()方法僅僅是反回(this == Object),所以Object的equals()方法僅僅是判斷對象是不是同一個對象,而對於那些繼承了Object類而又重寫了equals()方法的類,比如說String類,那就要依據具體的equals()方法的實現來判斷了.

String類特性與創建過程

1 String是常量,其對象一旦創建完畢就無法改變,當使用“+”拼接字符串時,會生成新的String對象,而不是向原有的String對象追加內容,對於java的String來說比軟特殊,java中有一個String pool的概念,它是由String這個類單獨在棧中維護。

2 采用literal(字面值)方式賦值時(如 Strng str = "strings"),java會查找String Pool(字符串池,由String這個類單獨維護)中是否存在"String",如果不存在,則在String Pool中創建一個"strings"對象,然後將String Pool中的這個"strings"對象地址返回來,賦給引用變量str,這樣str會指向String Pool中的這個"strings"字符串對象。

3 如果存在,則不創建任對象,直接將String Pool中這個"strings"對象地址返回來,賦給引用。

4 采用 String str = new String("strings")這個方式,首先在String Pool中查找有沒有"strings"這個字符串對象,如果有,則不在String Pool中再去創建"strings"這個對象了,直接在heap(堆)中創建一個"strings"字符串對象,然後將堆中這個"strings"對象地址返回來,賦給str引用,導致str指向了堆中創建的這個"strings"字符串對象。

5 如果沒有,則首先在String Pool中創建一個"strings"對象,然後再在heap中創建一個"strings"對象,然後將椎中這個"strings"對象的地址返回來,賦給str引用,導致str指向了堆中所創建的這個"strings"對象。參見java.lang.String.intern()方法。

了解了這些就來猜猜下面的例子吧

  1. public class StringTest {
  2. public static void main(String[] args) {
  3. String str3 = "abc"; //采的字面什的方式
  4. String str4 = "abc"; //不會創建新的對象
  5. System.out.println(str3 == str4);
  6. System.out.println(str3 == "abc".intern());
  7. System.out.println("-----------------------------------");
  8. String str = new String("java");
  9. String str2 = new String("java"); //會創建新的對象
  10. System.out.println(str == str2);
  11. System.out.println("-----------------------------------");
  12. String str5 = new String("strings");
  13. String str6 = "string";
  14. System.out.println(str5 == str6);
  15. System.out.println("-----------------------------------");
  16. //下面的一些是java語言規范,各種java虛擬機都要如此的實現
  17. String s = "hello";
  18. String s1 = "hel";
  19. String s2 = "lo";
  20. System.out.println(s == s1 + s2);
  21. System.out.println(s == "hel" + "lo");
  22. System.out.println(s == s1 + "lo");
  23. }
  24. }
Copyright © Linux教程網 All Rights Reserved