博客 / 詳情

返回

【java基礎】== 和 equals 的區別,重寫equals可以不重寫hashcode嗎

== 和 equals 的區別

在編程中,== 和 equals 是兩個經常使用的運算符,但它們在處理字符串和對象時有所不同。 讓我們詳細瞭解一下它們之間的區別。

首先,讓我們明確一下,== 是一個比較運算符,它比較兩個值的值是否相等。 如果兩個值相等,它返回 true;否則返回 false。 對於基本數據類型(例如 int、float、char 等),== 直接比較它們的值是否相等。 對於對象(例如 String、ArrayList 等),== 比較的是它們在內存中的地址是否相同,也就是説,比較的是它們是否指向同一個對象。

舉個例子:

String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1 == s2); // 輸出 false,因為 s1 和 s2 指向內存中不同的對象

另一方面,equals() 方法是 Object 類中的一個方法,所有類都從 Object 類中繼承。 這個方法也是用來比較兩個對象的內容是否相等的。 對於字符串來説,equals() 會比較字符串的內容是否相同,而不是內存地址。 對於其他對象,equals() 默認比較的是內存地址,但可以通過重寫這個方法來改變比較方式。

再舉個例子:

String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1.equals(s2)); // 輸出 true,因為 s1 和 s2 的內容相同

總結一下,== 主要用於基本數據類型的比較,而 equals() 主要用於對象的比較,特別是字符串的比較。 在處理字符串時,如果要比較字符串的內容是否相同,應該使用 equals();如果想要比較兩個字符串變量是否指向同一個對象,可以使用 ==。

重寫equals可以不重寫hashcode嗎

在Java中,如果你想要自定義一個類,並且想要根據這個類的實例對象比較內容是否相同,那麼你需要同時重寫equals()方法和hashCode()方法。這是因為,當你使用散列表(HashMap,HashSet等)存儲你的對象時,Java會使用hashCode()方法來決定對象在內存中的位置。如果兩個對象的hashCode()相同,那麼它們會被認為是相同的對象。因此,如果你只重寫了equals()方法而沒有重寫hashCode()方法,那麼在使用散列表時可能會出現問題。

例如,假設你有一個Person類,你重寫了equals()方法來比較兩個Person對象的內容是否相同,但是在你沒有重寫hashCode()方法的情況下,Person類的hashCode()方法會根據對象的內存地址返回一個哈希碼。那麼,如果你有兩個內容相同的Person對象存儲在散列表中,由於它們的hashCode()不同,它們會被認為是不同的對象,這顯然不是你想要的結果。

因此,如果你想要自定義一個類,並且想要比較這個類的實例對象的內容是否相同,你需要同時重寫equals()和hashCode()方法。這樣,你就可以確保在使用散列表時能夠正確地比較對象的內容。

user avatar lankerens 頭像 cunyu1943 頭像 edagarli 頭像 tracy_5cb7dfc1f3f67 頭像 biubiubiu_5ea3ee0e6b5fd 頭像 knifeblade 頭像 gozhuyinglong 頭像 u_16213560 頭像 jellyfishmix 頭像 shadowck 頭像 ixuea 頭像 tangtaixian_5fc4b5d1c3eff 頭像
14 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.