public class StringAndStringBuffer {
public static void main(String[] args) {
String str1="hello";
String str2="he"+"llo";
String str3="he"+new String("llo");
String str4=new String("hello");
System.out.println(str1==str2);
System.out.println(str1==str3);
System.err.println(str1.equals(str3));
System.err.println(str1==str4);
}
}
結果:true
false
true
false
分析:
1) 因為在比較中使用了== ,所以返回的值為一個布爾值
2)==與.equals()都可以比較值是否相等,但是局限於基本數據類型;在String類中==判斷的是其在內存中的地址是否相等, .equals可以比較值是否相等,所以如果比較兩個字符串的值是否相等,最好還是用equals(),如上面的str1==str3與str1.equals(str3)的區別
3)"hello","he","llo"都為字符串常量,
第一次出現字符串常量時會在池中創建一個新的,之后出現就不會創建了,而是直接把引用指向第一次創建的對象。但對於new出來的對象,
無論怎樣賦值,new一次創建一次(在堆中),不會考慮之前是否已經已存在相同的。而且,字符串是不可追加的,
所以每次使用連接符號其實相當於先產生一個常量,然后再賦給引用,原來指向的串就成垃圾被回收了。
str3創建過程中,new String("llo")存在於堆內存中,所以所得到的字符串對象在自己的內存中,而不再緩沖池中
str2創建的過程中,"he","llo"都已經存在緩存池中,得到的str2="hello"已經存在緩沖池中,所以直接引用str1
str4創建的對象存在於堆內存中,不能直接引用
4)System.out.println與System.err.println()都是打印出來,但是后者顯示的為紅色,而且在顯示順序上始終在out的后面
比較兩個字符串是否相等,優先使用
1)StringUtils.equals(str1,str2);
org.apache.commons.lang.StringUtils
2)str1.equals(str2);
3)str1==str2;
