一,對象
Java有兩種建立字符串的方式,內存
String str1 = "abc"; String str2 = new String("abc");
用雙引號建立和用new來建立。這兩種方式建立出來的String存儲的位置上不一樣的。當使用雙引號方式時,至關於顯式的聲明瞭字符串的值(字面值),因此是做爲一個常量,存儲在方法區的常量池中。使用new方式來建立String時,JVM會在堆上分配一塊區域,存儲一個String對象,值爲「abc」。字符串
二,方法
String的==和equals是不一樣的,==比較的是兩個String在內存中的地址是否相同,equals比較的是兩個String的值是否相同。因此,若是String是用雙引號方式建立,則兩個String都指向常量池中的同一個位置,這時==是成立的,equals也成立。若是String是用new方式建立的,兩個String若是不是指向堆上的同一個String對象,則==不成立,而若是值相同,則equals成立。如:im
String str1 = "abc"; String str2 = new String("abc"); String str3 = "abc"; String str4 = str2; System.out.println(str1 == str3);//true System.out.println(str1.equals(str3));//true System.out.println(str2 == str3);//false System.out.println(str2.equals(str3));//true System.out.println(str2 == str4);//true, str4和str2指向同一個對象 System.out.println(str2.equals(str4));//true
三,img
兩種不一樣方式建立的字符串,在進行運算時結果是不一樣的。若是一個String是由兩個常量運算獲得的,至關於用雙引號建立出來,會存入常量池,如:字符
String s = "a" + "b"; String t = "ab"; //以上兩種建立方式,徹底等價
若是運算時,等號右邊有一個「運算數」不爲常量(即便該「運算數」是用雙引號建立的常量),則獲得的結果至關於new建立的一個新的String對象,如:new
String str1 = "abc"; String str2 = "abcd"; String str3 = "abc" + "d"; String str4 = str1 + "d"; System.out.println(str2 == str3);//true System.out.println(str2.equals(str3));//true System.out.println(str2 == str4);//false System.out.println(str2.equals(str4));//true
四,intern()方法的用法。intern方法會返回一個字符串對應的常量值。在執行intern方法時,JVM會檢查常量池中是否存在和該字符串相同的常量值,若是有,則返回該常量值,若沒有,則建立該常量值,並返回。即,intern返回的是值常量池中的String,不是堆上的String,至關於用雙引號建立String。ab
String str1 = "abc"; String str2 = "abcd"; String str3 = "abc" + "d"; String str4 = (str1 + "d").intern(); System.out.println(str2 == str3);//true System.out.println(str2.equals(str3));//true System.out.println(str2 == str4);//true System.out.println(str2.equals(str4));//true //注意和上例的區別