3

我可以了解哈希码如何根据添加到向量的元素获取值吗?

  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
4

2 回答 2

4

它对于 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()对于任何两个列表, list1并且list2,正如 的一般合同所要求的那样Object.hashCode()

正如 gloomcoder 所示,它只AbstractList包含这个实现,因此不是每个List接口的实现者都必须再次执行此操作。

例如,您也可以编写Arrays.asList("1", "2").hashCode()并得到相同的 2530(只要您不更改 的hashCode()实现String)。

于 2011-04-09T18:43:24.053 回答
2

因为 Vector 扩展了 AbstractList,所以它使用它作为它的 hashCode。这就是它的作用。

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;
}
于 2011-04-09T17:58:26.023 回答