我知道这已被问过几次,我保证在阅读之前我已阅读了100多篇文章。这是我的问题:
我创建了自己的对象(WorkoutData
)。它由几个字符串变量,整数和字符串链表组成:
public class WorkoutData implements Serializable {
private static final long serialVersionUID = 878893767880469289L;
String workoutLocation;
String bodyPart;
String exercise;
int numOfSets;
LinkedList<LinkedList<String>> datesSetsAndReps;
}
如果有任何重复项进入我的数据文件,我将对象读入LinkedHashSet
。我的想法是,这将自动消除任何重复。
当然这不起作用,因为每个对象都有自己的ID,因此不会等于&#34;到另一个对象。为了解决这个问题,我覆盖了equals
课程中的hashCode
和WorkoutData
。
由于某种原因,它仍然无法正常工作。这是我如何加载我的linkedHashSet:
for (int iterator = 0; iterator < numberOfWorkouts; iterator++)
tempWorkoutDataSet.add((WorkoutData) in.readObject());
以下是我在WorkoutData
类中重写的方法:
@Override
public boolean equals(Object other)
{
if (other == null)
{
return false;
}
if (this.getClass() != other.getClass())
{
return false;
}
if (!this.workoutLocation.equals(((WorkoutData)other).workoutLocation))
{
return false;
}
if (!this.bodyPart.equals(((WorkoutData)other).bodyPart))
{
return false;
}
if (!this.exercise.equals(((WorkoutData)other).exercise))
{
return false;
}
return true;
}
public int hashCode()
{
return this.workoutLocation.length();
}
无论我尝试什么,hashset都包含重复项。我认为equals
方法是正确的,但我承认我不知道hashCode
方法的目的是什么。
这个问题不是&#34;我如何比较Java中的字符串?&#34;。该问题仅涉及 == vs .equals 问题。我的问题更多与覆盖hashCode
有关。我认为这就是我的问题所在。再加上我仍然不清楚hashCode
覆盖是什么意图完成的事实。
答案 0 :(得分:0)
感谢那里的所有帮助,我能够解决这个问题。这相当于两个基本问题:
覆盖equals(而不是尝试==)是正确的做法,可以防止将重复项添加到hashSet中。由于对象具有数字标识符==将无法工作,您必须使用等号。如果equals不被覆盖,则hashSet将使用系统提供的equals,其几乎与==相同。问题是我试图摆脱在我的基本代码中使用的东西==,我错误地在对象类文件中的equals覆盖中使用。一旦我改变了equals覆盖以使用!equals(如上所示)而不是!=代码按计划工作。
覆盖hashCode也很重要。我的覆盖是无用的,因为它返回的值在所有(或大多数)情况下都不是唯一的。根据提供的一些帮助链接,我配置了一个hashCode覆盖方法,该方法使用与equals覆盖相同的逻辑,如建议的那样。这也在上面显示。请注意,如何在hashCode覆盖中使用equals覆盖中使用的对象的相同3个参数。
现在代码工作正常。覆盖hashSet中对象的equals和hashCode的概念起初很复杂,但在反射时似乎相当容易。再次感谢您的帮助!