-2

我正在努力学习 Java。Eric Roberts 的文本“Java 的艺术与科学”有一个编程任务,我们在其中模拟航班预订控制台。我想通过使用只有城市字符串的城市类来“分类”。它只有一个字段 ,name它是一个字符串,但我正在尝试学习如何使用类。

无论如何,所以我不得不重写 City 类中的 equals 方法以避免重复。所以我不得不重写 hashCode 方法。

现在我HashMap<City,ArrayList<Flight>>的不工作了。它找不到某些值,并且仍然允许重复键。

我的城市equalshashCode覆盖如下。谁能看到为什么我的 HashMap 出错了?

/* (non-Javadoc)
 * @see java.lang.Object#equals(java.lang.Object)
 */
@Override
public boolean equals(Object that) {
    // TODO Auto-generated method stub
    if ( this == that ) return true;
    if ( !( that instanceof City) ) return false;
    City aThat = (City) that;
    return (name == aThat.name );
}

@Override
public int hashCode() {
    // TODO Auto-generated method stub
    return name.hashCode();
}
4

2 回答 2

3

对于对象比较使用equals()而不是==,原因==比较参考值以确定它们是否指向同一个对象。

@Override
public boolean equals(Object that) {
    //more code
    return (name.equals(aThat.name) );
}

顺便说一句,你的hashCode()这也很糟糕,因为你name可能为 null,你会得到一个NullPointerException.

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

最后的建议是,我不建议您将其用作hash structurehashMap 之类的键,mutable objects因为它hashCode()会发生变化并且可能会发生意外行为。最好inmutable objects用作键。如果 City 类是不可变的,那么没关系,但如果不是,则更改它。

于 2013-08-26T01:29:39.777 回答
-1

检查对象的值是否相同时,不要使用 ==。而是使用 .equals,在您的 equals 方法中将 == 更改为 .equals,

例如

String str1 = "Foo bar";
String str2 = "Foo bar";
str1 == str2 // not always true!
str1.equals(str2) // very true

@Override
public boolean equals(Object that) {
    // TODO Auto-generated method stub
    if ( this == that ) return true;
    if ( !( that instanceof City) ) return false;
    City aThat = (City) that;
    return (name.equals(aThat.name) );   // <--- see edit 
}
于 2013-08-26T01:00:12.303 回答