歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

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.           
  9.         String str = new String("java");  
  10.         String str2 = new String("java"); //會創建新的對象   
  11.         System.out.println(str == str2);  
  12.         System.out.println("-----------------------------------");  
  13.           
  14.         String str5 = new String("strings");  
  15.         String str6 = "string";  
  16.         System.out.println(str5 == str6);  
  17.         System.out.println("-----------------------------------");  
  18.         //下面的一些是java語言規范,各種java虛擬機都要如此的實現   
  19.         String s = "hello";  
  20.         String s1 = "hel";  
  21.         String s2 = "lo";  
  22.         System.out.println(s == s1 + s2);  
  23.         System.out.println(s == "hel" + "lo");  
  24.         System.out.println(s == s1 + "lo");  
  25.           
  26.     }  
  27. }  
Copyright © Linux教程網 All Rights Reserved