【发布时间】:2019-02-18 10:04:20
【问题描述】:
我在编写代码时遇到了一些麻烦,我给你举个简单的例子(虽然它会稍微复杂一点,这个简单的代码也不能正常工作)。
class Sign {
private String char;
private Integer freq;
public Sign(String c) {
this.char = c;
}
@Override
public boolean equals(Object o) {
String check = (String)o;
return check.equals(this.char);
}
@Override
public int hashCode() {
int hash = 7;
hash = 31 * hash + this.char.hashCode();
return hash;
}
}
为了简单起见,我假设在 equals 方法中总会有一个字符串。还有一些 hashCode() 也可以确保 contains() 方法有效,这是测试本身:
ArrayList<Sign> queueOfSigns = new ArrayList<>();
Sign test = new Sign("C");
String c = "C";
queueOfSigns.add(test);
if(queueOfSigns.contains("C"))
System.out.println("I am here!");
无论如何,这个简单的测试代码在这种情况下总是返回 false - 所以“我在这里”消息永远不会出现。我一直在尝试一些不同的方法来处理我的代码,但这是因为这样做的想法是从字符串文本中获取单个字符并检查单个字符是否已经存在于 ArrayList 中。尽管如此 - 如果没有让这个简单的测试正常工作,我无法继续前进,所以我想问你 - 我错过了什么。这是我第一次真正使用 equals() 和 hashCode() 方法来让我自己的对象与 contains() 方法一起正常工作。
【问题讨论】:
-
问题很可能是
new Sign("C").equals("C")没有返回与"C".equals(new Sign("C"))相同的内容。要正常工作,equals需要是对称的:a.equals(b) == b.equals(a)应该始终为真。