以一個小例子來說明java中 == 與 equals() 的區別

<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>


結果: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;

轉載地址:http://www.cnblogs.com/lshblogs/p/4742659.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章