先說幾個概念吧
1.常量池
指的是在編譯期確定,并被保存在已編譯的字節(jié)碼文件中的一些數(shù)據(jù),它包括類、方法、接口等中的常量,也包括字符串常量。
2.==: 比較是否是同一個對象
3.equals(): 比較的是對象里的內(nèi)容
下面我開始說區(qū)別
第1種:
String a="abc"; String b="abc"; System.out.print(a==b);
結(jié)果:true
原因:編譯時,這兩個"abc"被認(rèn)為是同一個對象保存到了常量池中;運行時JVM則認(rèn)為這兩個變量賦的是同一個對象,所以返回true。
第2種:
String a=new String("abc"); String b=new String("abc"); System.out.print(a==b);
結(jié)果:false
原因:用構(gòu)造器創(chuàng)建的對象,是不會被放入常理池中的,也很明顯這完全是兩個對象,只是內(nèi)容相同罷了,結(jié)果當(dāng)然為false了。用equals()或者System.out.print(a.intern()==b.intern());就返回true了。
第3種
String a="abc"; String b=new String("abc"); System.out.print(a==b);
結(jié)果:false
原因:同上
第4種
String a="abcdef"; System.out.print(a=="abcdef");
結(jié)果:true
原因:運行出現(xiàn)的字符串常量,若是在常量池中出現(xiàn)過,則JVM會認(rèn)為同一個對象,以節(jié)省內(nèi)存開銷,所以這兩個字符串會被認(rèn)為是同一個對象。
第5種
String a="abcdef"; String b=""; String c=a+b; System.out.print(c=="abcdef");
結(jié)果:false
原因:編譯時,先將"abcedf"放在常量池中,而c的值則是在運行時在堆里創(chuàng)建的。所以為false。