Java 重写hashcode和equals时出现问题
我想创建一个将字符串列表作为输入的类。 我想重写这个类的hashcode和equals,这样当发送的字符串列表相等时,不管它们的顺序如何,这个类总是返回true 代码如下:Java 重写hashcode和equals时出现问题,java,overriding,hashcode,Java,Overriding,Hashcode,我想创建一个将字符串列表作为输入的类。 我想重写这个类的hashcode和equals,这样当发送的字符串列表相等时,不管它们的顺序如何,这个类总是返回true 代码如下: public final class TableValues { private final String[] tableValue; TableValues(final String[] values) { this.tableValue = values; }
public final class TableValues
{
private final String[] tableValue;
TableValues(final String[] values)
{
this.tableValue = values;
}
/**
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + Arrays.hashCode(tableValue);
return result;
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(final Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final TableValues other = (TableValues) obj;
if (!Arrays.equals(tableValue, other.tableValue))
return false;
return true;
}
}
但当我这样做的时候:
final String[] str1 = {"A", "B", "C"};
final String[] str2 = {"B", "C", "A"};
final TableValues tab1 = new TableValues(str1);
final TableValues tab2 = new TableValues(str2);
if (tab1.equals(tab2))
{
System.out.println("Equal");
}
else
{
System.out.println("Not Equal");
}
它总是不相等。
这里出了什么问题?两个
TableValues
实例不相等,因为数组不相等。这是因为数组中元素的顺序很重要。如果要进行顺序不敏感匹配,则必须将其添加到代码中,以便它将具有相同内容但不同顺序的两个数组视为相同数组,或者在顺序不重要的情况下使用字符串集。尝试更改:
if (!Arrays.equals(tableValue, other.tableValue))
return false;
致:
从Arrays.equals的文档中:
如果两个数组在同一个数组中包含相同的元素,则它们是相等的
秩序
因为不管顺序如何,都需要它们是相等的,所以你必须先对它们进行排序>代码>数组。同样的< /代码>认为它们是相等的。我会说<代码> SET>代码>是坏主意,因为它将产生与<> > [ a ]、“a”] /<代码>和< > > [a ] 相同的结果。我会说在创建时对数组进行排序(如果顺序不重要),或者创建一个单独的数组,如果原始顺序重要,则进行排序。@Dunes:我假设这些字符串代表表列名,因此不可能重复。如果可以复制,那么是的,我同意你的看法。这似乎是一个公平的假设,你的答案比公认的答案要好。你的哈希码算法将为不同的字符串顺序提供不同的哈希码。我认为这不是您希望发生的事情。不要忘记在hashCode()方法中也执行排序。相等的对象必须生成相同的哈希代码(如这些方法的契约中所定义)。
if (!Arrays.equals(Arrays.sort(tableValue), Arrays.sort(other.tableValue)))
return false;