另一个LinkedHashSet .equals困境

时间:2015-05-11 20:26:21

标签: java

我知道这已被问过几次,我保证在阅读之前我已阅读了100多篇文章。这是我的问题:

  1. 我创建了自己的对象(WorkoutData)。它由几个字符串变量,整数和字符串链表组成:

    public class WorkoutData implements Serializable {
        private static final long serialVersionUID = 878893767880469289L;
        String workoutLocation;
        String bodyPart;
        String exercise;
        int numOfSets;
        LinkedList<LinkedList<String>> datesSetsAndReps;
    }
    
  2. 如果有任何重复项进入我的数据文件,我将对象读入LinkedHashSet。我的想法是,这将自动消除任何重复。

  3. 当然这不起作用,因为每个对象都有自己的ID,因此不会等于&#34;到另一个对象。为了解决这个问题,我覆盖了equals课程中的hashCodeWorkoutData

    由于某种原因,它仍然无法正常工作。这是我如何加载我的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覆盖是什么意图完成的事实。

1 个答案:

答案 0 :(得分:0)

感谢那里的所有帮助,我能够解决这个问题。这相当于两个基本问题:

  1. 覆盖equals(而不是尝试==)是正确的做法,可以防止将重复项添加到hashSet中。由于对象具有数字标识符==将无法工作,您必须使用等号。如果equals不被覆盖,则hashSet将使用系统提供的equals,其几乎与==相同。问题是我试图摆脱在我的基本代码中使用的东西==,我错误地在对象类文件中的equals覆盖中使用。一旦我改变了equals覆盖以使用!equals(如上所示)而不是!=代码按计划工作。

  2. 覆盖hashCode也很重要。我的覆盖是无用的,因为它返回的值在所有(或大多数)情况下都不是唯一的。根据提供的一些帮助链接,我配置了一个hashCode覆盖方法,该方法使用与equals覆盖相同的逻辑,如建议的那样。这也在上面显示。请注意,如何在hashCode覆盖中使用equals覆盖中使用的对象的相同3个参数。

  3. 现在代码工作正常。覆盖hashSet中对象的equals和hashCode的概念起初很复杂,但在反射时似乎相当容易。再次感谢您的帮助!