天天看點

hashCode和hashSet的關系和作用。

[b]hashCode[/b]

當使用toString方法的時候傳回一個 "類型名@#$%#^%$ "的東西,比如一個****@4e57de。"@ "前面的是你的類名,後面的就是散列碼的16進制表示。

hashCode 叫哈希代碼或稱散列碼,簡單的說就是通過雜湊演算法算出來的一大竄數字之類的東西和記憶體有關。預設的實作是将對象内部位址轉化為整數作為HashCode,這當然能保證每個對象具有不同的HasCode,因為不同的對象内部位址肯定不同(廢話)。是以你可以簡單了解為對象在記憶體中的位址 擔不是絕對實體位址。

[b]hashSet[/b]

他是一個集合,Java中的集合(Collection)有兩類,一類是List,再有一類是Set。前者集合内的元素是有序的,元素可以重複;後者元素無序,但元素不可重複

當我們向HashSet集合中添加元素時,它是按hash算法來存儲集合中的元素。首先HashSet會調用該對象的hashCode()方法來得到該對象的hashCode值,然後根據該hashCode值決定該對象在HashSet中的存儲位置。如果兩個元素通過equals方法比較傳回true,但它們的hashCode()方法傳回值不相等,HashSet将會把它們存儲在不同位置,也就添加成功。

HashSet集合判斷兩個元素的标準是兩個對象通過equals方法比較相等,并且兩個對象的hashCode()方法傳回值也相等

[b]總結:[/b]hashCode方法對于hashSet的作用

表面上看來,HashSet集合裡面的元素都是沒有索引的,實際上當程式向HashSet集合中添加元素的時候,HashSet集合會根據這個元素的HashCode值來決定他的存儲位置--這個就是說,每個元素的hashCode就是他的"索引";

為什麼不直接使用數組呢,還需要使用HashSet呢?,因為數組元素的索引是連續的 ,而且數組的長度是固定的,無法自由增加數組的長度,而且HashSet就不一樣了,HashSet來根據每個元素HashCode作為索引,進而自由增加了HashSet的長度,并可以根據元素的HashCode值來通路元素,是以,從HashSet中通路元素的時候,HashSet先計算元素的HashCode值(也就是調用這個對象的HashCode()方法的傳回值),安徽直接到這個HashCode對于的位置去取出這個元素---這就是HashSet集合速度很快的原因

如下一個例子;

import java.util.*;
/**
* 
*/

//類A的equals方法總是傳回true,但沒有重寫其hashCode()方法
class A
{
        public boolean equals(Object obj)
        {
                return true;
        }
}
//類B的hashCode()方法總是傳回1,但沒有重寫其equals()方法
class B
{
        public int hashCode()
        {
                return 1;
        }
}
//類C的hashCode()方法總是傳回2,且重寫其equals()方法
class C
{
        public int hashCode()
        {
                return 2;
        }
        public boolean equals(Object obj)
        {
                return true;
        }
}
public class HashCode
{
        public static void main(String[] args) 
        {
                HashSet books = new HashSet();
                //分别向books集合中添加2個A對象,2個B對象,2個C對象
                books.add(new A());
                books.add(new A());
                books.add(new B());
                books.add(new B());
                books.add(new C());//C類重寫了equals()方法總是傳回true、hashCode()總是傳回2.導緻HashSet将會把兩個C對象當成一個對象。
                books.add(new C());
                System.out.println(books);
        }
}
           

結果為[[email protected], [email protected], [email protected], [email protected], [email protected]]