equals ,hashCode 的區別和聯絡

2021-09-27 11:40:54 字數 1636 閱讀 1183

今天突然想起 == 和equals的問題,然後又想起之前面試的時候曾經被問equals和hashcode()的區別,正好整理一下。

1.首先討論==問題:

看一組比較,包括基本型別和其包裝類,引用型別之間的比較

string str1 = new string("hello");

string str2 = new string("hello");

system.out.println(str1==str2);//false

string str3 = "hello";

string str4 = "hello";

system.out.println(str3==str4);//true

system.out.println(str1==str3);//false;

integer it1 = 12;

integer it2 = 12;

system.out.println(it1==it1);//true

integer it3 = new integer(12);

integer it4 = new integer(12);

system.out.println(it3==it4);//false

system.out.println(it1==it3);//false

int it5 = 12;

system.out.println(it1==it5);//true

system.out.println(it3==it5);//true

==比較的是物件的引用,凡是與new的物件比較,必須是同一物件,特殊情況是基本資料型別和string的常量池,string常量池裡面的值唯一,因此值相同,位址相同,==成立;基本資料型別和其包裝模擬較,會自動拆裝箱,值相同==就成立

2.equals()方法

原生的equals()比較的也是引用位址,但是重寫之後可以比較堆裡面的值內容是否相等,一般用於集合元素的比較,避免重複插入。下面是重寫的string的equals()方法

public boolean equals(object anobject)  

if (anobject instanceof string)  

return true;  //每個對應位置的字元相等

}  }  

return false;  //長度不等 直接返回

}  3.hashcode()方法

根據物件的值計算其物理儲存位置,即hash值,對於值equals的物件,其hashcode一定相等,但是即使值不相等,也可能得到相同的hash值,因此在同一hash值的位置形成了鍊錶,可以看出,每次new出乙個物件,直接計算出其hash值,然後尋找對應位置上,再使用equals方法比較,是否已存在值就可以知道物件是否重複了,這樣比依次呼叫equals()與集合中的每個元素比較要節省很多時間。hash位址允許衝突,但是設計的越分散效能越好。

4.equals()與hashcode()的比較

兩個物件equals,則hashcode一定相等,因為計算方式一樣

兩個物件不equals,則hashcode不一定不相等,因為可能存在位址衝突

兩個物件hashcode相等,物件不一定equals,因為可能存在位址衝突

兩個物件hashcode不相等,物件一定不equals

Equals HashCode 演算法解析

關於equals和hashcode的講解已經有很多文章了 但我覺得大都空泛,套用,不能使人看了能懂,我決定結合自己的理解,畫乙個樣圖,說明下hashcode的原理和演算法,希望能幫助大家對這個煩人的理論有個真正的理解。0 1 201 2567 1011 12上面這 表示通過hash演算法後,資料的分...

equals ,hashCode 重寫步驟的詳解

系統自動生成的物件的唯一編號 1.equals 相等的兩個物件,hashcode 必須保持一致 系統為了提高效率,hashset 等,判斷兩個物件相等的時候,會先比較hashcode 如果一致,呼叫equals 進行比較,如果不一致,就認為不相同,就不再呼叫equals 方法了 equals 方法比...

container of 的的的原理

另外一篇,同樣精彩,揭開linux核心中container of的神秘面紗 華清遠見嵌入式學院講師。在linux 核心中有乙個大名鼎鼎的巨集container of 這個巨集是用來幹嘛的呢?我們先來看看它在核心中是怎樣定義的。呵呵,乍一看不知道是什麼東東。我們先來分析一下container of p...