2011-04-09 30 views
2

我可以瞭解散列碼如何將每個元素的值添加到向量中?將散列碼解釋爲Vector

Vector v = new Vector(); 

    //Add elements to Vector 
    v.add("1"); 
    System.out.println(v.hashCode()); 
    v.add("2"); 
    System.out.println(v.hashCode()); 
    v.add("="); 
    System.out.println(v.hashCode()); 

的哈希碼值

80 
2530 
78491 

回答

3

它對List接口的每個(真實)實現都是一樣的(如果它支持添加元素的話)。 .hashCode方法的行爲在List.hashCode()中定義如下:

返回此列表的哈希碼值。列表的哈希碼被定義爲以下計算的結果:

int hashCode = 1; 
Iterator<E> i = list.iterator(); 
while (i.hasNext()) { 
    E obj = i.next(); 
    hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode()); 
} 

這確保list1.equals(list2)意味着list1.hashCode()==list2.hashCode()對於任何兩個列表, list1list2,所要求的的Object.hashCode()常規協定。

由於glowcoder顯示,AbstractList只包含此實現,因而不是List接口的每一個實現者必須再次做到這一點。例如,您也可以編寫Arrays.asList("1", "2").hashCode()並獲得相同的2530(只要您不更改String的實現hashCode())。

2

因爲向量擴展AbstractList中,它使用它爲它的哈希碼。這是它的功能。

public int hashCode() { 
int hashCode = 1; 
Iterator<E> i = iterator(); 
while (i.hasNext()) { 
    E obj = i.next(); 
    hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode()); 
} 
return hashCode; 
} 
+0

另請參閱[散列](http://www.ibm.com/developerworks/java/library/j-jtp05273/index.html)。 – trashgod 2011-04-09 18:07:01