向hash解释哈希码

时间:2011-04-09 17:55:19

标签: java collections vector hashcode java-6

我可以根据添加到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

2 个答案:

答案 0 :(得分: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(),   根据{{​​1}}的一般合同的要求list1list2

正如glowcoder所示,Object.hashCode()只包含此实现,因此并非AbstractList接口的每个实现者都必须再次执行此操作。

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

答案 1 :(得分: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;
}