天天看點

java == 和equals

1.首先說說java有8中資料類型:

浮點型:float(4 byte) double(8 byte)

整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)

字元型:char(2 byte)

布爾型:boolean(JVM規範沒有明确規定其所占的空間大小,僅規定其隻能夠取字面值”true”和”false”)

《Java程式設計思想》中有這樣一句話:

“關系操作符生成的是一個boolean結果,它們計算的是操作數的值之間的關系”。

看一個例子:

public class Main {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    int n=3;
    int m=3;

    System.out.println(n==m);  **true**

    String str = new String("hello");
    String str1 = new String("hello");
    String str2 = new String("hello");

    System.out.println(str1==str2);   **false**

    str1 = str;
    str2 = str;
    System.out.println(str1==str2);  **true**
}
           

}

其實隻要知道基本資料類型變量和非基本資料類型變量的差別。

對于java中8種基本資料類型的變量,變量直接存儲的是“值”,是以在用關系操作符==來進行比較時,比較的就是 “值” 本身。

int n=3;

int m=3; 

變量n和變量m都是直接存儲的”3”這個數值,是以用==比較的時候結果是true。

String是引用類型,是以str1和str2是引用類型變量,引用類型的變量存儲的并不是 “值”本身,而是與其關聯的對象在記憶體中的位址。

String str1 = new String(“hello”);

String str2 = new String(“hello”);

變量str1,str2 中存儲的是它指向的對象在記憶體中的存儲位址,并不是“值”本身,

二者指向的是不同的對象,也就是說他們實際存儲的記憶體位址不同,==這裡比較的是他們的存儲的記憶體位址,是以傳回false。

str1 = str;

str2 = str;

System.out.println(str1==str2); true

讓str1和str2指向了str指向的對象,那麼他們存儲的記憶體位址是相同的,是以==比較結果為true。

equals:

在Object類中,equals方法是用來比較兩個對象的引用是否相等,即是否指向同一個對象。

String str1 = new String(“hello”);

String str2 = new String(“hello”);

System.out.println(str1.equals(str2)); true

為什麼會傳回true呢?

String類對equals方法進行了重寫,用來比較指向的字元串對象所存儲的字元串是否相等。

其他的一些類諸如Double,Date,Integer等,都對equals方法進行了重寫用來比較指向的對象所存儲的内容是否相等。

總結來說:

  1)對于==,如果作用于基本資料類型的變量,則直接比較其存儲的 “值”是否相等;

    如果作用于引用類型的變量,則比較的是所指向的對象的位址

  2)對于equals方法,注意:equals方法不能作用于基本資料類型的變量

    如果沒有對equals方法進行重寫,則比較的是引用類型的變量所指向的對象的位址;

    諸如String、Date等類對equals方法進行了重寫的話,比較的是所指向的對象的内容。