java中equals和 的思考

2021-06-04 15:50:38 字數 1643 閱讀 3258

首先是==操作符。

針對物件而言,是兩個物件引用指向的物件的內部位址是否一致,如果一致,就是true,否則就是false,假設,有乙個類a,用a定義了乙個物件:a a = new a();a a1=a;其中的a和a1就是物件引用,a引用指向的位址是a物件的內部位址,此時a賦值給a1,a1也指向了新物件a的內部位址,所以兩個物件引用,是相等的。如果是這種情況:a a = n   ew a();a b = new a();實質是建立了兩個a物件,開闢了兩塊記憶體,具有兩個位址(假設d1,d2),a引用指向d1,b引用指向d2,所以a==b的執行結果是false。

針對基本資料型別而言,比較的就是變數代表的值是否相等,假設 int i = 1,j=1;此時i==j的執行結果是true,針對基本資料型別沒有引用的概念,假設int i=1;int j=i;   此時只是將i的值copy乙份給j,所以j的值改變了,並不會影響i的值。

再解:實質上==,比較的是變數(包括引用變數)中所儲存的值是否一致,一致為true,否則為false;對於基本資料型別好理解,因為基本資料型別的賦值操作是copy乙份     值賦給另乙個變數;針對物件而言,如果乙個變數指向的資料是物件型別的,那麼,這時候涉及了兩塊記憶體,物件本身占用一塊記憶體(堆記憶體),變數也占用一塊記憶體,例如objet obj = new object();變數obj是乙個記憶體,new object()是另乙個記憶體,此時,變數obj所對應的記憶體中儲存的數值就是物件占用的那塊記憶體的首位址。對於指向物件型別的變數,如果要比較兩個變數是否指向同乙個物件,即要看這兩個變數所對應的記憶體中的數值是否相等,這時候就需要用==操作符進行比較。

其次是equals方法。

equals方法主要還是從**來理解,首先來看object類,這是所有物件的根類,以下是object類中的equals方法的原始碼:

public boolean equals(object obj)

從中可以看見object類中equals方法的本質是==,所以要比較物件的內容的時候,經常需要重寫equals方法(如果不想重寫equals方法的話,可以引用apache的jar包-commons-lang-2.4.jar,該包的中的equalsbulider類可供使用,例如:equalsbuilder.reflectionequals(a1, a2))。再者根據hashcode的常規協定,就必須再重寫hashcode方法。

對string類而言,由於string中針對了equals方法已經進行了重寫,所以預設比較的就是string的內容,還有一些基本資料型別的包裝類integer等類,也是對equals方法重     寫了,預設比較的就是其中的值。但針對這幾種型別,要注意equals和==的區別,假設如下**:

integer i = new integer(1);integer j = new integer(1);

i==j的執行結果是false,i.equals(j)的執行結果是true;

改變下以上**:integer i = 1;integer j = 1;

i==j的執行結果是true,i.equals(j)的執行結果是true;

為什麼呢?(如果是string型別也是一樣的)

情況一:通過new建立了2個物件,這時==操作符,肯定結果就是false,而equals比較的是內容,都是1,就為true;

情況二:1是乙個常量,在整個緩衝區中只有乙份,所以,i和j實際指向的都是同乙個1,所以==操作的結果就是true。

Java 中equals 和 的區別

疑問 equals 和 是用來幹什麼的?1 比較8種基本資料型別的引用位址,是否一樣 2 比較引用物件的內容,即堆的記憶體位址,是否一樣 疑問 兩者區別?public boolean equals object o 如果不重寫equals 兩者是沒有區別的。分析下string中兩者的區別 strin...

Java中「equals「和「 「的區別

1.在基本資料型別中 對於基本型別而言,判斷的是兩個變數的值是否相等 equals 不能用於基本資料型別,如果要比較,就需要使用基本型別對應的包裝類 2.在引用型別中 比較的是變數的值在棧記憶體中存放的物件的堆記憶體位址 即比較引用的記憶體位址 equals 比較的是兩個物件的值是否相同 不是比較記...

java中equals和 的區別

比較的是位址,可以比較物件和屬性 equals只用來比較物件,equals內部是由 實現的,所以比較的也是位址,因為每個物件都繼承了object自帶equals方法,但有些類庫重寫了equals方法。1.首先對於屬性的,因為是八種基本資料型別之一 byte,short,char,int,long,f...