1. 程式人生 > >Java面試中hashCode()與equals(Object obj)方法關係的準確回答

Java面試中hashCode()與equals(Object obj)方法關係的準確回答

hashCode()與equals(Object obj)都是Java Object物件中的方法,也就是說Java的一切物件都提供這麼兩個方法。這兩個方法在Java中有著不一般的聯絡;在Java類操作中,也起著至關重要的計算依據。

大家都知道,Java中有兩大集合體系(Collection與Map),從這兩個類衍生出來的實現類為大家日常使用的類(HashMap,ArrayList,LinkedList等等),而大多數集合類中判斷是否增加元素使用的就是物件中的hashCode()與equals(Object obj)方法;當面試中面試官丟擲(hashCode與equals方法有什麼聯絡時),應該分情況說明

一:當物件沒有重寫hashCode()與equals(Object obj)方法

回答:當equals相等時,hashCode一定相等;equals不等時,hashCode一定不等
解釋:此時物件呼叫的Object中的hashCode與equals方法;equals比較的是記憶體地址,hashCode的值為記憶體地址的計算雜湊結果值

如下為Jdk1.8 Object物件中hashCode方法的註釋

If two objects are equal according to the equals(Object) method, then calling the hashCode method on
each of the two objects must produce the same integer result (中文翻譯:如果兩個物件根據equals(Object)方法相等,則在兩個物件中的每個物件上呼叫hashCode方法必須產生相同的整數結果) It is not required that if two objects are unequal according to the java.lang.Object.equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer
results (中文翻譯:根據java.lang.Object.equals(java.lang.Object)方法,如果兩個物件不相等,則不需要,因此在兩個物件中的每個物件上呼叫hashCode方法必須產生不同的整數結果)

二: 當物件重寫hashCode(),保留equals(Object obj)方法

回答:當equals相等時,hashCode一定相等;equals不等時,hashCode可能相等,也可能不等
解釋:equals方法在Object物件中比較的是記憶體地址,equals相同則表明為同一個物件,hashCode獲取的是同一個hashCode方法返回值;那為什麼equals不等時,還是出現hashCode相等的情況呢?
例子

public class Demo {
    private Integer id;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = super.hashCode();
    }

    @Override
    public int hashCode() {
        return id;
    }

}

當new兩個Demo物件,賦值id都是1;地址不相等,但hashCode是否相等呢?

三: 當物件保留hashCode(),重寫equals(Object obj)方法

回答:equals可能相等,也可能不等;hashCode一定不等
解釋:hashCode呼叫的是Object的hashCode方法,根據物件記憶體地址計算雜湊值,兩個記憶體地址不相同的物件,hashCode一定不相等;equals是否相等,取決於重寫的方法怎麼寫。
例子

public class Demo {
    private Integer id;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Demo) {
            Demo o = (Demo) obj;
            return o.getId().intValue() == this.getId();
        }
        return false;
    }
}

重寫的equals方法實際比較的是兩個物件的id值,當兩個物件的Id值一致時,則equals相等

四: 當物件重寫hashCode(),且重寫equals(Object obj)方法

回答:equals可能相等,也可能不等;hashCode可能相等,也可能不等
解釋:結合(二、三)的例子,你一定知道我想表達什麼。

好了,這就是我對Java中hashCode()與equals(Object obj)方法這兩者間關係的總結,當中可能有點“毀三觀”,可能不全對,大家多多包涵。如有糾正處,請評論留言

相關推薦

Java面試hashCodeequalsObject obj方法關係準確回答

hashCode()與equals(Object obj)都是Java Object物件中的方法,也就是說Java的一切物件都提供這麼兩個方法。這兩個方法在Java中有著不一般的聯絡;在Java類操作中,也起著至關重要的計算依據。 大家都知道,Java中有兩大

Java雙等號比較運算子equals的區別

1.比較運算子==用於判斷字串的地址是否相同,即使字串內容相同,但是物件不同,返回值仍是false 注:這裡補充一下Java中資料型別:內建資料型別、引用資料型別 (1)內建資料型別:JAVA提供了8種基本資料型別byte、short、int、long、float、double、boolea

JavalongLongintInteger之間的轉換

轉化 string long tar str 基礎數據類型 ava detail 參考 一、將long型轉化為int型,這裏的long型是基礎類型: long a = 10; int b = (int)a; 二、將Long型轉換為int型,這裏

javalongLongintInteger之間的轉換

示例程式碼: public static void main(String[] args) { // 1、將long型轉化為int型,其中int、long是基礎型別 long a = 10; int b = (int) a; System.out.print

JAVA面試JAVA常考點之資料結構演算法1

                            JAVA常考點之資料結構與演算法(1) JAVA常考點之資料結構與演算法 目錄

JAVA的基礎-----過載重寫覆蓋的區別:overloadoverride

JAVA中多型的實現機制主要通過overload和override實現。 1)方法的過載:簡言之,就是指同一個類有多個同名的方法,這些方法擁有不同的引數(同名不同參)。可以認為是類中方法的多型性,也稱為編譯時多型。 2)方法的重寫(覆蓋):子類可覆蓋父類的方法,已達到“個性

java的dispatch分派binding繫結

在java語言的實現機制中,需要對函式名與具體函式進行繫結(binding),而在呼叫之前需要對已經繫結好的函式進行分派(dispatch)。我們接下來具體討論繫結和分派的機制。繫結是將函式名與具體函式程式碼進行關聯的過程。由於java語言的多型特性,繫結分為兩種:1.提前/

java 學習筆記--Comparator為什麼其他類實現這個介面為什麼沒有複寫equalsObject obj這個方法

其實java存在好多隱藏的複寫。 大多數類好像未複寫的方法其實是繼承父類的而方法而隱藏複寫的。 而如下例:  class HelloComparator implements Comparator  {@Overridepublic int compare(Object o

Java面試常見的開源框架的面試問題

此次整理的面試問題一共兩篇博文,因筆者能力所限,整理不夠完善的地方希望大家給予寶貴的修改意見。 1、hibernate和mybatis的區別。 相同點: 1)都屬於ORM框架 2)都是對jdbc的包裝 3)都屬於持久層的框架 不同點: 1)hibernate是面

java過載overload重寫override的區別

方法過載(overload):方法過載就是在一個類中可以建立多個方法,它們具有相同的名字,但是具有不同的引數和不同的定義,呼叫方法時通過傳遞給它們的不同引數個數和引數型別來決定具體使用哪個方法,這就是多型性,過載的時候方法名一樣,引數型別和個數不一樣,返回值型別可以相同可以不

如何在面試介紹自己的專案經驗面向java改進版

    本人於3年前寫的博文,如何在面試中介紹自己的專案經驗,經過大家的捧場,陸續得到了將近7萬個點選量,也得到了眾多網站公眾號的轉載,不過自己感覺,這篇文章更多的是偏重於方法,沒有具體給到Java方面相關的說辭。     三年過去了,隨著本人面試官經驗的積累,也隨著技

== equals方法的區別

return 使用 自定義類 [] true 適用於 內容 lean 編譯 * equals()方法的使用 * * 1.java.lang.Object類中的equals()方法的定義: * * public boolean equals(Object obj

shell的變量eval

use web ech 讀取 eva bin 報錯 href 命令行 原文鏈接:http://www.361way.com/shell-eval-variable/4957.html shell 中經常會用到變量的嵌套的情況。比如,單個或多個變量的值作為變量名,再對該變量名

day20 java 語言的讀取寫入數據

day20 java 語言中的讀取寫入數據(一)day20 java 語言中的讀取寫入數據(一)一、io概述 io數據流的讀寫功能,在實際的生活中也很常見,比如文件的上傳、下載,日誌的自動更新等都與io讀寫密切相關。io又被分為了讀取數據和寫入數據兩個大的功能。下面就來看看讀取數據的幾種類。二、讀取

day21 java 語言的讀取寫入數據

day21 java 語言中的讀取寫入數據(二)day21 java 語言中的讀取寫入數據(二)一、概述: 使用IO流寫文件,就體現的是下載的功能。所以說很有必要單獨說一下。二、寫入功能:(下載) 寫入功能同樣也是被分隔為了字符流寫入和字節流寫入兩個方式。 (一):字符流寫入數據

Spring AOP高級——源碼實現2Spring AOP通知器Advisor切面Aspect

color oaf 小麻煩 ntc tro sta ins pack package 本文例子完整源碼地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/Spring%20AO

.NET客戶端實現Redis的管道PipeLine事物Transactions

redis服務器 net 他會 端口 ocs string new equal alt 原文:.NET客戶端實現Redis中的管道(PipeLine)與事物(Transactions)序言 Redis中的管道(PipeLine)特性:簡述一下就是,Redis如何從客戶端一

java面試常問問題及部分答案2018

java 面試 2018年 基礎 一:java基礎1.簡述string對象,StringBuffer、StringBuilder區分string是final的,內部用一個final類型的char數組存儲數據,它的拼接效率比較低,實際上是通過建立一個StringBuffer,讓後臺調用appen

hashcodeequals的作用、區別、聯系

ces 引用 val 流程圖 依據 highlight key 基本類 util 介紹一、 hashCode()方法和equal()方法的作用其實一樣,在Java裏都是用來對比兩個對象是否相等一致,那麽equal()既然已經能實現對比的功能了,為什麽還要

C++重載overload、覆蓋override隱藏oversee

acl 普通 evc dft war srx rpo 成員 avt body, table{font-family: 微軟雅黑; font-size: 10pt} table{border-col