编辑: 这个问题不是关于按位运算符,无法回答为什么XOR经常在java hashCode()中使用,但很少使用其他按位运算符?
我已经看到了对象的哈希计算的不同方法:
class A {
public B b;
public C c;
@Override
public boolean equals();
@Override
public int hashCode() {
return c.hashCode() ^ b.hashCode(); //XOR
return c.hashCode() + prime * b.hashCode(); // SUM
return Objects.hash(b,c); // LIB
}
}
Run Code Online (Sandbox Code Playgroud)
似乎LIB方法使用SUM,但为什么它比XOR更好?
即使示例是Java,这个问题更多的是关于数学和概率.
在这篇MSDN文章 http://msdn.microsoft.com/en-us/library/ms132123.aspx中, 它讨论了Class Equalitycomparer并有一个例子.在这个关于比较它的例子中它有这个类 -
class BoxSameDimensions : EqualityComparer<Box>
{
public override bool Equals(Box b1, Box b2)
{
if (b1.Height == b2.Height & b1.Length == b2.Length
& b1.Width == b2.Width)
{
return true;
}
else
{
return false;
}
}
public override int GetHashCode(Box bx)
{
int hCode = bx.Height ^ bx.Length ^ bx.Width;
return hCode.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白行hCode = bx.Height ^ bx.Length ^ bx.Width;
有人可以解释一下吗?为什么xor?
我今天发现了这段代码:
private static class Node{
private final int code1;
private final int code2;
public Node(int code1, int code2) {
this.code1 = code1;
this.code2 = code2;
}
@Override
public int hashCode() {
return (code1 * 31) ^ code2;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Node) {
Node node = (Node) obj;
return node.code1 == code1 && node.code2 == code2;
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
哈希码是否有充分的理由使用(code1*31)^ code2; ?
根据我的理解,创建哈希码的常用方法是将当前哈希码(或第一个字段)乘以素数,并为每个字段添加下一个字段.
为什么在这里需要电源 XOR运算符?
我试图比较两个ArrayLists,但我似乎无法让它工作.
假设:
我的名为List 1的主arrayList通过以下方式获取其值:
ArrayList<xTypeClass> List1 = new ArrayList<xTypeClass>();
xTypeClass tmp = new xTypeCLass();
tmp.setName(name);
tmp.setaddress(address);
tmp.setPhone(phone);
tmp.setMonth(mo);
..etc
List1.add(tmp);
Run Code Online (Sandbox Code Playgroud)
现在我有另一个list2,它包含确切的类型格式,但具有不同的值.我想将List2与1进行比较,看看List2中哪些不存在于List1中并将其添加到List2.我有问题使用双循环来绕过两个列表找到哪些存在,哪些不存在.有人能指出我正确的方向吗?如果您需要更多信息,请在下方发表评论