String str1="hello"; 以一個小例子來講明 == 與 equals() 的區別

java中的數據類型,可分爲兩類: 
1.基本數據類型,也稱原始數據類型。byte,short,char,int,long,float,double,boolean 
  他們之間的比較,應用雙等號(==),比較的是他們的值。 

2.複合數據類型(類) 
  當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,因此,除非是同一個new出來的對象,他們的比較後的結果爲true,不然比較後結果爲false。 JAVA當中全部的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行爲是比較對象的內存地 址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現,而再也不是比較類在堆內存中的存放地址了。
  對於複合數據類型之間進行equals比較,在沒有覆寫equals方法的狀況下,他們之間的比較仍是基於他們在內存中的存放位置的地址值的,由於Object的equals方法也是用雙等號(==)進行比較的,因此比較後的結果跟雙等號(==)的結果相同。java

 

public class StringAndStringBuffer {apache

 public static void main(String[] args) {   緩存

 String str1="hello";  spa

 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);class

 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;

相關文章
相關標籤/搜索