我试图理解在hashcode方法中返回什么..对于一个字符串我知道我要返回(例子)name.hashcode()。但是我为int变量返回什么?我们看到了不同的例子,当他们返回变量数x 1 000时,但从未明白为什么。
任何人都可以请我解释如何返回一个整数值。
答案 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
在评论中,按以下顺序:
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个存储在另一个地方。查找值需要迭代五个值。
HashSet
而不是调用myInt
)Integer.hashCode
。Long.hashCode
的总和,其中P是素数;见P * o.hashCode()
但我不记得为什么要使用素数的确切答案。