我经常hashCode()使用IntelliJ IDEA 自动生成类的方法,通常该方法采用以下形式:
result = 31 * result + ...
Run Code Online (Sandbox Code Playgroud)
我的问题是乘以31的目的是什么?我知道这是一个素数,但为什么选择31?此外,如果hashCode()为特别小/大的数据集实现a ,人们会以不同的方式处理这个问题吗?
我正在研究如何为类构建最好的HashCode,我看到了一些算法.我看到了这一个:Hash Code实现,似乎是.NET类HashCode方法类似(通过反映代码看).
所以问题是,为什么不创建上面的静态类以便自动构建HashCode,只需传递我们认为是"键"的字段.
// Old version, see edit
public static class HashCodeBuilder
{
public static int Hash(params object[] keys)
{
if (object.ReferenceEquals(keys, null))
{
return 0;
}
int num = 42;
checked
{
for (int i = 0, length = keys.Length; i < length; i++)
{
num += 37;
if (object.ReferenceEquals(keys[i], null))
{ }
else if (keys[i].GetType().IsArray)
{
foreach (var item in (IEnumerable)keys[i])
{
num += Hash(item);
}
}
else
{
num += keys[i].GetHashCode();
}
}
}
return …Run Code Online (Sandbox Code Playgroud) 在Java中创建哈希表(或关联数组...)最直接的方法是什么?我的google-fu已经出现了几个例子,但是有一种标准的方法吗?
有没有办法用键 - >值对列表填充表,而无需在每个对的对象上单独调用add方法?
在hashCode方法的Best实现中接受的答案给出了一种看似很好的方法来查找哈希码.但我是Hash Codes的新手,所以我不知道该怎么做.
对于1),我选择的非零值是否重要?是1就像其他号码如黄金一样好31?
对于2),我是否将每个值添加到c?如果我有两个字段都是一个long,int,double,等?
我是否在本课程中正确解释了它:
public MyClass{
long a, b, c; // these are the only fields
//some code and methods
public int hashCode(){
return 37 * (37 * ((int) (a ^ (a >>> 32))) + (int) (b ^ (b >>> 32)))
+ (int) (c ^ (c >>> 32));
}
}
Run Code Online (Sandbox Code Playgroud) 如果有两个布尔字段,我如何实现一个好的哈希码?通常人们只是将整数值添加到其哈希码值中.但是,如果我只是在我的哈希码中添加1或0,我认为它不好.因为如果我有两个A类对象:
obj1.b = true,obj1.c = false.
obj2.b = false,obj2.c = true.
其他一切都是一样的.然后这两个不等对象的哈希码是相同的.我知道这种情况还可以.但想象一下,如果有100个布尔字段,那么会有太多的碰撞对吗?我不希望这么多不同的对象落入同一个桶中.
我在下面做的是为每个字段的不同真值分配不同的数字,因此对象的哈希码可能非常不同.
public class A {
private final String a;
private final boolean b;
private final boolean c;
...
@Override public int hashCode(){
int i,j;
if(b) {
i = 10;
}
else {
i = 0;
}
if(c) {
j = 88;
}
else {
j = 3;
}
int result = 0;
result = 31*result + i + j;
result = 31*result + (a != null ? a.hashCode() …Run Code Online (Sandbox Code Playgroud) 我有一个简单的自定义Point类,如下所示,我想知道我的hashCode实现是否可以改进,或者这是否是最好的.
public class Point
{
private final int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
@Override
public boolean equals(Object other)
{
if (this == other)
return true;
if (!(other instanceof Point))
return false;
Point otherPoint = (Point) other;
return otherPoint.x == x && otherPoint.y == y;
}
@Override
public int hashCode()
{
return (Integer.toString(x) + "," + Integer.toString(y)).hashCode(); …Run Code Online (Sandbox Code Playgroud) 我想使用一种干净/自动的方式来检查 Java 对象是否已被修改。
我的具体问题如下:
在我的 Java 应用程序中,我使用 XStream 库将 XML 反序列化为 Java 对象,然后用户可以修改或更改它们。我想要一种方法来检查内存中的这些对象是否在某些时候与序列化的对象不同,因此我可以通知用户并询问他是否要保存更改(即使用 XStream 进行序列化)。在我的应用程序中有许多对象并且非常复杂。
请考虑到我在我的应用程序中没有使用数据库,所以我对使用 hibernate 等解决方案不感兴趣。
我有一堂课:
public class School {
private String name;
private int id;
private boolean isOpen;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public boolean isOpen() {
return isOpen;
}
public void setOpen(boolean isOpen) {
this.isOpen = isOpen;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我创建了两个School实例,并比较了两个实例的相等性:
public static void main(String[] args) {
//school1
School school1 = new School();
school1.setId(1);
school1.setName("schoolOne");
//school2
School …Run Code Online (Sandbox Code Playgroud) 我像这样初始化 HashSet:
private HashSet<Rule> ruleTable = new HashSet<Rule>();
Run Code Online (Sandbox Code Playgroud)
我的对象(抽象类的子类)的equals()和hashCode()方法如下所示:TcpRuleRule
@Override
public int hashCode() {
// Ignore source Port for now
return (this.getSrcPool() + ":" + this.getDstPool() + ":" + this.getProtocol() + ":" + this.dstTcp).hashCode();
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof TcpRule))
return false;
if (obj == this)
return true;
TcpRule r = (TcpRule) obj;
return (this.getSrcPool().equals(r.getSrcPool()) && this.getDstPool().equals(r.getDstPool()) && this.getProtocol().equals(r.getProtocol()) && this.getSrcTcp() == r.getSrcTcp() && this.getDstTcp() == r.getDstTcp());
}
Run Code Online (Sandbox Code Playgroud)
我什至写了一个简单的单元测试,它没有给出任何错误: …
有人hashCode()在任何地方使用?
任何人都可以给我一个确切使用哈希码的例子,在哪些情况下我们需要实现它? 使用HashCode的任何特定区域?