Hashcode返回整数值

时间:2014-09-19 11:57:27

标签: java hashmap hashcode

我试图理解在hashcode方法中返回什么..对于一个字符串我知道我要返回(例子)name.hashcode()。但是我为int变量返回什么?我们看到了不同的例子,当他们返回变量数x 1 000时,但从未明白为什么。

任何人都可以请我解释如何返回一个整数值。

1 个答案:

答案 0 :(得分:0)

如果您有课程Foobar

public class Foobar {
  private final int myInt;

  ... constructor ...

  public int hashCode() {
    return Integer.hashCode(myInt);
  }
}

从Java 8开始,方法Integer.hashCode存在。否则,您可以使用Integer.valueOf(myInt).hashCode()

注意: in the question,你会读到hashCode和equals不应该基于可变字段,这就是为什么我把final放在{{1}的声明中}。实际上,它取决于用例(例如,基于JPA中myInt中生成的ID的Set)以及您的数据来源。

现在至于“好”OneToMany,因为它用于基于散列的集合(map,set),你需要有一个很好的重新分区:想象你返回hashCode,这意味着值介于0和999之间;然后这个myInt % 1000效率不高:

HashSet

在评论中,按以下顺序:

    {li> Set<Integer> set = new HashSet<Integer>(20); // initial capacity of 20 set.add(0); // 0 [[0]] set.add(1000); // 0 [[0, 1000]] set.add(2000); // 0 [[0, 1000, 2000]] set.add(3000); // 0 [[0, 1000, 2000, 3000]] set.add(20); // 20 -> 20 % 20 => 0 [[0, 1000, 2000, 3000, 20]] set.add(21); // 1 -> 1 % 20 => 1 [[0, 1000, 2000, 3000, 20], [1]] hashCode 返回
  • 如果不是小事,myInt % 1000在内部index数组中。
  • HashSet
  • 的内容

前四个值(0到3000)将存储在同一个地方,20个也将存储在同一个地方,但21个存储在另一个地方。查找值需要迭代五个值。

  • 对于Java Integer,它是值(在这里,您可以返回HashSet而不是调用myInt
  • 对于Java Long,它是一些xor(使用^);见Integer.hashCode
  • 对于收集,通常是Long.hashCode的总和,其中P是素数;见P * o.hashCode()

但我不记得为什么要使用素数的确切答案。