區(qū)別
String s = new String(“hello”)會創(chuàng)建2(1)個對象鹏秋,String s = “hello”創(chuàng)建1(0)個對象。
注:當(dāng)字符串常量池中有對象hello時括號內(nèi)成立腹鹉!
引入
==與equals()的區(qū)別:
==:比較引用類型比較的是地址值是否相同
equals:比較引用類型默認(rèn)也是比較地址值是否相同,而String類重寫了equals()方法,比較的是內(nèi)容是否相同绅络。
Demo
publicclassStringDemo2 {publicstaticvoidmain(String[] args) {
? ? ? ? ? ?String s1 =newString("hello");
? ? ? ? ? ?String s2 ="hello";
? ? ? ? ? ?System.out.println(s1 == s2);// false
? ? ? ? ? System.out.println(s1.equals(s2));// true}
}
**運行結(jié)果:**
>false
>true
代碼詳解
首先别惦,通過main()方法進棧狈茉。
然后再棧中定義一個對象s1,去堆中開辟一個內(nèi)存空間,將內(nèi)存空間的引用賦值給s1掸掸,“hello”是常量氯庆,然后去字符串常量池 查看是否有hello字符串對象,沒有的話分配一個空間存放hello扰付,并且將其空間地址存入堆中new出來的空間中堤撵。
在棧中定義一個對象s2,然后去字符串常量池中查看是否有”hello”字符串對象悯周,有粒督,直接把”hello”的地址賦值給s2.
即s1中存的是堆中分配的空間,堆中分配的空間中存的是字符串常量池中分配空間存放”hello”的空間的地址值禽翼。而s2中之間存的是字符串常量池中分配空間存放”hello”的空間的地址值屠橄。
由于s1與s2中存放的地址不同,所以輸出false闰挡。因為锐墙,類String重寫了equals()方法,它比較的是引用類型的 的值是否相等长酗,所以輸出true溪北。即結(jié)果為false、true。
Demo1
publicclassStringDemo1 {publicstaticvoidmain(String[] args) {
String s1 =newString("hello");
String s2 =newString("hello");
System.out.println(s1 == s2);// false
System.out.println(s1.equals(s2));// true
String s3 =newString("hello");
String s4 ="hello";
System.out.println(s3 == s4);// false
System.out.println(s3.equals(s4));// true
String s5 ="hello";
String s6 ="hello";
System.out.println(s5 == s6);// true
System.out.println(s5.equals(s6));// true}
}
結(jié)果:
Demo1詳解
s1~s6用equals()的比較不解釋之拨,都是比較的值茉继,均為true。以下講解==
s1蚀乔、s2:二者均為new出來的烁竭,各自在堆中分配有空間,并各自將內(nèi)存地址賦值給s1吉挣、s2派撕。空間地址不同睬魂,==比較為false终吼。但是各自在堆中空間中保存的值均為在字符串常量池中的同一個對象的地址。根據(jù)Demo處的圖即解釋不難理解氯哮。
s3际跪、s4同上Demo出解釋。
s5蛙粘、s6都是在常量池中取值垫卤,二者都指向常量池中同一對象,其地址值相同出牧,所以結(jié)果為true穴肘。
Demo2
publicclassStringDemo4 {publicstaticvoidmain(String[] args) {
String s1 ="hello";
String s2 ="world";
String s3 ="helloworld";
System.out.println(s3 == s1 + s2);// false
System.out.println(s3.equals((s1 + s2)));// true
System.out.println(s3 =="hello"+"world");//false
System.out.println(s3.equals("hello"+"world"));// true}
}
結(jié)果:
Demo2詳解
equals()比較方法不解釋,比較值舔痕,均相等评抚,均為true。
s1與s2相加是先在字符串常量池中開一個空間伯复,然后拼接慨代,這個空間的地址就是s1與s2拼接后的地址。與s3的地址不同啸如,所以輸出為false侍匙。
s3與”hello”+”world”作比較,”hello”+”world”先拼接成”helloworld”,然后再去字符串常量池中找是否有”helloworld”,有叮雳,所以和s3共用一個字符串對象想暗,則為true。
總結(jié):
String s = new String(“hello”)會創(chuàng)建2(1)個對象帘不,String s = “hello”創(chuàng)建1(0)個對象说莫。
注:當(dāng)字符串常量池中有對象hello時括號內(nèi)成立!
字符串如果是變量相加寞焙,先開空間储狭,在拼接互婿。
字符串如果是常量相加,是先加辽狈,然后在常量池找慈参,如果有就直接返回,否則稻艰,就創(chuàng)建懂牧。