<span style="font-family:Microsoft YaHei;font-size:14px;">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);
}
}</span>
以一個小例子來說明java中 == 與 equals() 的區別
結果: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);
2)str1.equals(str2);
3)str1==str2;
轉載地址:http://www.cnblogs.com/lshblogs/p/4742659.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.