java基礎入門-day18-equals()和hashCode()

2020-12-12 懶人部落

1 euqals()方法

我們以Person類為例:public boolean equals(Object o)

l 如果當前對象與o指向同一實例,那麼直接返回true

if(this == o) return true;

l 如果o不是Person類型,那麼直接返回false

boolean b = o instanceof Person;

if(!b) return false;

l 把o向下轉型為Person類型

Person p = (Person)p;

l 如果當前對象的name與p對象的name不相等,那麼返回false

if(!name.equals(p.name)) return false;

l 如果當前對象的age與p對象的age不相等,那麼返回false

if(!age == p.age) return false;

l 如果當前對象的sex與p對象的sex不相等,那麼返回false

if(!sex.equals(p.sex)) return false;

l 執行到這裡,可以肯定兩個元素是相等的了,返回true

return true

publicbooleanequals(Object o) {

if(this== o) {

returntrue;

}

booleanb = o instanceof Person;

if(!b) {

returnfalse;

}

Person p = (Person)o;

if(!name.equals(p.name)) {

returnfalse;

}

if(age != p.age) {

returnfalse;

}

if(!sex.equals(p.sex)) {

returnfalse;

}

returntrue;

}

2 hashCode()方法

我們以Person類為例:int hashCode()

l 定義int h = 0,最終返回h;

l 計算所有屬性的哈希值;

l 計算age:數值類型的屬性本身作為值:

h += this.age;

l 計算name:引用類型的屬性調用其hashCode()方法:

h += name.hashCode();

l 計算sex:引用類型的屬性調用其hashCode()方法:

h += sex.hashCode();

l 最後返回h

對象的hashCode()都在100之內,這對計算桶的分配會過於其中。例如有一萬個桶,而元素都放到了0~10之間的桶中,其它桶中沒有元素,這就不好了!所以需要修改上面的hashCode()方法,放大多個對象哈希碼之間的間隔。

int h = 1;//如果為0,那麼乘以基數也是枉然!

int prime = 31;//基數

h += prime * h + age;

h += prime * h + name.hashCode();

h += prime * h + sex.hashCode();

return h;

publicinthashCode() {

inth = 1;

intprime = 31;

h += prime * h + age;

h += prime * h + name.hashCode();

h += prime * h + sex.hashCode();

returnh;

}

相關焦點

  • Java為什麼重寫equals一定要重寫hashCode?
    初步探索首先我們要了解equals方法是什麼,hashcode方法是什麼。equals方法equals 是java的obejct類的一個方法,equals的源碼如下:由此我們可以看到equals是用來比較兩個對象的內存地址是否相等。
  • java中雙等號和equals的區別,重寫equals時要重寫hashcode
    重寫equals需要重寫hashcode上面的例子我們也看到了用equals去比較Student返回的false,因為它比較的是內存地址。如果我們想比較內容的話就需要在Student類裡面重寫equals方法和hashcode方法,這兩個方法是屬於Object裡面的方法,任何類都隱式的繼承了Object類。那為什麼非得重寫hashcode呢?因為對象的比較有硬性規定:應用執行期間,同一個對象內容不發生改變,經過多次調用,hashCode方法都必須始終返回同一個值。
  • Java中重寫equals方法為什麼要重寫hashcode方法?
    當equals方法被重寫時,通常有必要重寫hashCode方法,以維護hashCode方法的常規約定:值相同的對象必須有相同的hashCode。object1.equals(object2)為true,hashCode也相同;hashCode不同時,object1.equals(object2)為false;hashCode相同時,object1.equals(object2)不一定為true
  • 「原創」不重寫equals和hashcode難道就不行嗎?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫究竟為什麼要重寫equals和hashcode???目錄1、equals()方法和hashCode()方法介紹1.1、equals()方法1.2、hashCode()方法
  • 不懂得hashcode的重要性,程序的性能會大打折扣
    hashcode這個問題要分情況回答:第一種:如果沒有重寫equals和hashcode,那默認就是使用Object的,Object中比較的是對象地址第二種:自己重寫equals和hashcode,這就不一定了。這得看你自己怎麼寫hashcode了。
  • Java:hashCode()和equals()的contains,Set方法的協定
    本文是關於hashCode的,它等於Set中用於contains(Object o)方法的協定。e == null:o.equals(e))時,contains()方法返回true。因此,contains()方法實際上使用equals()方法檢查相等性。注意,可以將null作為元素添加到集合中。以下代碼實際上顯示true。所述公共布爾等於(對象OBJ)方法在對象類中定義。
  • Java HashSet源碼分析
    原理在《Head fist java》一書中有描述:當你把對象加入 HashSet 時,HashSet 會先計算對象的 hashcode 值來判斷對象加入的位置,同時也會與其他加入的對象的 hashcode 值作比較,如果沒有相符的 hashcode,HashSet 會假設對象沒有重複出現。
  • 用Java創建對象的5種不同方式
    0 : name.hashCode());return result;public boolean equals(Object obj) {if (this == obj)return true;ifEmployee emp3 = constructor.newInstance();emp3.setName("Yogesh");System.out.println(emp3 + ", hashcode : " + emp3.hashCode());// By
  • 萬字梳理,帶你拿下 Java 面試題!
    對稱性:對於任何非空引用 x 和 y 來說,若x.equals(y)為 true,則y.equals(x)也為 true。傳遞性:對於任何非空引用的值來說,有三個值,x、y 和 z,如果x.equals(y) 返回true,y.equals(z) 返回true,那麼x.equals(z) 也應該返回true。
  • java語言的==和equals 你真的知道用法區別嗎
    java語言的==和equals 你真的知道用法區別嗎在java語言中,數據分為基本數據類型和引用數據類型。基本數據類型存儲在棧內存,引用數據類型的引用(就是變量的地址)存儲在堆內存。其實本質上equals 和 == 是一樣的,equals的底層源碼也是用的==,都是比較變量的引用,只不過對於字符串來說,equals被重寫了。== 是對兩個變量的引用進行判斷是否相等,就是判斷兩個變量指向的內存空間地址是否相同。是對地址的比較。
  • String的hashCode方法不能濫用
    最近有小夥伴在使用java1.6的jdk時,發現1.6版本switch ..case 不支持字符串類型。首先,升級jdk版本是不可能的,比較老項目,只能用1.6的。比如下面這樣寫,jdk1.6不支持。首先,需要理解一下hashCode方法的含義,以及知道不同String,調用hashCode方法返回的值可能是相同的,比如"Aa"和"BB"的hashCode方法返回的都是2112.這時如果用在這裡,就有問題了。
  • java學習之高級語法——Set 集合
    java.util.HashSet 集合 implements Set接口HashSet 接口的特點:(3)是一個無序集合,存儲元素和取出元素的順序可能不一致(4)底層是一個哈希表結構,特點是 「 查詢速度快 」
  • java集合詳解合集
    值得主要的是,HashSet集合判斷兩個元素相等的標準是兩個對象通過equals()方法比較相等,並且兩個對象的hashCode()方法的返回值相等1.1.1) LinkedHashSetLinkedHashSet集合也是根據元素的hashCode值來決定元素的存儲位置,但和HashSet不同的是,它同時使用鍊表維護元素的次序,這樣使得元素看起來是以插入的順序保存的
  • Java的新未來:JVM、Kotlin和Java將在2020年後走向何方?
    Java Lambdas和Streams於2014年發布,那是Java抗擊Scala邁出的最大一步,目前從事該行業的每個人都可以感受到Scala近年來遭受的損失。擁有更多競爭對手的另一個好處是JIT編譯器和JVM本身會不斷改進。現在,有更多的人嚮往更優化的JVM和其改善的性能。
  • Java基礎-今日內容介紹(collection、map集合框架、可變參數
    LinkedHashSet 自身特性,具有順序,存儲和取出的順序相同的 線程不安全的集合,運行速度塊(hashset 取出不一定按順序,LinkedHashSet取出是有序的,但是都不允許重複)對於自定義對象判斷是否重複,需要重寫 hashcode 和equals方法。
  • Java初學者入門必須掌握4大核心基礎!
    靜態方法和屬性用於描述某一類對象群體的特徵,而不是單個對象的特徵。Java中大量應用了靜態方法和屬性,這是一個通常的技巧。但是這種技巧在很多語言中不被頻繁地使用。理解靜態方法和屬性對於理解類與對象的關係是十分有幫助的,在大量的Java規範中,靜態方法和屬性被頻繁使用。
  • Java集合框架——面試必備
    HashMap需要一個hash函數,它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素。當調用put()方法的時候,HashMap會計算key的hash值,然後把鍵值對存儲在集合中合適的索引上。如果key已經存在了,value會被更新成新值。
  • 給Java新手的一些建議——Java知識點歸納(Java基礎部分)
    寫這篇文章的目的是想總結一下自己這麼多年來使用java的一些心得體會,主要是和一些java基礎知識點相關的,所以也希望能分享給剛剛入門的Java程式設計師和打算入Java開發這個行當的準新手們,希望可以給大家一些經驗,能讓大家更好學習和使用Java。這次介紹的主要內容是和J2SE相關的部分,另外,會在以後再介紹些J2EE相關的、和Java中各個框架相關的內容。