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


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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM