String s1 = "abc";//"abc"是一個對象,將對象賦予類變量s1 String s2 = new String("abc");//這裏是兩個對象,在內存中存在兩個,包括對象abc 和 new 出來的對象 String s3 = "abc"; //由於String類型數據是不可變的,因此‘abc’被放在了常量池中,這裏的‘abc’ַ和s1的‘abc’是 //同一個常量abc對象,所以兩者的內存地址是同樣的。 System.out.println(s1==s2);//false System.out.println(s1==s3);//true 這是這號i
public class StringDemo { public static void main(String[] args) { String str = "Hello"; str = str + "World"; str += "!!!"; System.out.println(str); } }
public static void main(String[] args) { String stra = "hello" ; String strb = "hello" ; String strc = "hello" ; System.out.println(stra == strb);//true System.out.println(stra == strc);//true System.out.println(strb == strc);//true } }
String s = "aa"; s =s + "bb"; String s2 = "aabb"; s == s2;???
這個的結果是false,這時候s 和s2已經不是同樣的了,首先看 s2,s2指向的是常量池中的對象,這是肯定的。因此儘管s的值和s2是同樣的,可是s指向的不是常量池的中的對象,而是一個新的new出來的對象。 解釋以前,先了解一下 + 這個符號,在字符串拼接裏面,至關於+ 源碼大意爲: (new StringBuffer()).append(s3).append(「bbb」).toString; 因此,這裏的s指向的是一個新的對象。緩存
總結: 在String的兩種聲明方式,直接賦予字符值的是,String對象引用獲取常量池中對象的地址,因此String聲明出來是不能夠改變的。new String()出來的是在堆內存建立對象。若是要給每一個對象中的String屬性賦予一個初始值,採用String s = ‘abc’方式,這樣建立的是常量池中的一個對象,其餘對象是獲取這個常量的地址。要是new 則每次都要建立,加大內存消耗。還要注意,字符串拼接不要用+ ,會建立對象。安全
public class Demo1 { @Test public void test1() { String s1 = "abc";//"abc"是一個對象,將對象賦予類變量s1 String s2 = new String("abc");//這裏是兩個對象,在內存中存在兩個,包括對象abc 和 new 出來的對象 String s3 = "abc"; //由於String類型數據是不可變的,因此‘abc’被放在了常量池中,這裏的‘abc’ַ和s1的‘abc’是 //同一個常量abc對象,所以兩者的內存地址是同樣的。 System.out.println(s1==s2);//false System.out.println(s1==s3);//true 這是這號i //+ 源碼大意爲: (new StringBuffer()).append(s3).append("bbb").toString; //是新new出一個新的StringBuffer對象, s3 = s3+"bbb";//這時候s3已經不指向"abc",源對象依舊存在,s3是新的string類型的對象 String s4 = "abcbbb"; String s5 = new String("abcbbb"); System.out.println(s3); System.out.println(s3==s4);//false s3是一個新的String對象 System.out.println(s4=="abcbbb");//true 這個「abcbbb」屬於同一個常量池中的對象 System.out.println(s4==s5);//false 一個在常量池,一個是new的對象 } }
String s1 = "abc"; String s2 = new String("abc"); String s3 = new String("abc").intern();//s3實際上是字符串常量"abc" /* s1是常量池中的對象,s2是堆中對象,是不一樣對象 */ System.out.println(s1 == s2);//false //二者都是表示字符串常量abc,因此是true System.out.println(s1 == s3);//true //s3是常量池中的對象abc,s2是堆中對象,是不一樣對象 System.out.println(s2 == s3); //都表示一個值abc System.out.println(s1 == "abc"); //true System.out.println(s3 == "abc"); //true