與 equals的區別

2022-08-27 17:00:09 字數 2245 閱讀 5153

==:

它的作用是判斷兩個物件的位址是不是相等。即,判斷兩個物件是不是同乙個物件。(基本資料型別==比較的是值,引用資料型別==比較的是記憶體位址)

equals():

它的作用也是判斷兩個物件是否相等。但它一般有兩種使用情況:

● 情況1: 類沒有覆蓋equals() 方法。則通過equals( 比較該類的兩個物件時,等價於通過"==」比較這兩個物件。

● 情況2: 類覆蓋了equals() 方法。一般,我們都覆蓋equals() 方法來兩個物件的內容相等;若它們的內容相等,則返回true (即,認為這兩個物件相等)。

例:

public class test }}

執行結果:

結果說明:

● string中的equals 方法是被重寫過的,因為object 的equals 方法是比較的物件的記憶體位址,而string 的equals 方法比較的是物件的值。

● 當建立string 型別的物件時,虛擬機會在常量池中查詢有沒有已經存在的值和要建立的值相同的物件,如果有就把它賦給當前引用。如果沒有就在常量池中重新建立乙個 string 物件。

新建乙個student類不重寫equals和hashcode,並在上測試類中新增以下**:

student student1 = new student(18, "zhangsan"); //兩個物件位址不同值相同

student student2 = new student(18, "zhangsan");

system.out.println("stusent1"+student1);

system.out.println("stusent2"+student2);

if (student1==student2)

if (student1.equals(student2))

輸出結果:

兩個物件位址不同值相同。

只重寫equals:

@override

public boolean equals(object o)

輸出結果:

只重寫equals就可以判斷兩個位址不相同的物件是否值相等了。

此時在測試類中將兩個物件放入乙個雜湊集合中:

hashsetset = new hashset<>();

set.add(student1);

set.add(student2);

system.out.println(set);

輸出結果:

此時未重寫hashcode發現兩個值一樣的物件被存入了雜湊集合中,這與雜湊集合的特性相違背。(也重寫了tostring便於觀察)

重寫hashcode方法:

@override

public int hashcode()

輸出結果:

此時可以看到兩個物件引用的物件其實是乙個位址,即只有乙個例項化的student物件,而且set雜湊集合中也只有乙個物件。避免物件儲存於雜湊集合是出現不必要的錯誤。

這裡雖然兩個引用指向物件的值和位址都相同即指向堆中的同乙個物件,但是這兩個引用的實體地址是不相同,故不滿足"stu1==stu2"

注意:如果要比較兩個物件的值是否相等,必須重寫equals方法,如果還要將此物件儲存於雜湊集合中必須要重寫hashcode

與equals的區別

注意 當比較兩個基本資料型別的變數是否相等時 基本資料型別包括 byte short int long float double 當它們的值相同時,則 結果就為true eg public class class6 1 public static void main string args stri...

與equals的區別

public class equaltest 執行結果為 t1 t2 false t1 t2 t3 true t3 t4 true i1.equals i2 false i3.equals i1 i2 true i3.equals i4 true st1 st2 false st1 st2 st3 ...

與 equals的區別

與equals都是比較兩個變數得到true或false。在進行比較時,先說說記憶體,記憶體分為堆和棧。基本資料型別中,是把值存在棧中,把值傳遞給變數,這種傳遞叫值傳遞。引用資料型別中,是在棧中存位址,堆中存的new的物件,給變數賦值傳遞時,傳的是位址,這種傳遞叫引用傳遞。基本資料型別 int a 1...