【问题标题】:Java ArrayList does not use overriden equals(Object o) method to compareJava ArrayList 不使用重写的 equals(Object o) 方法进行比较
【发布时间】:2021-01-15 03:50:56
【问题描述】:

为什么 ArrayList 的 contains(Object o) 不运行我重写的 equals(Object o) 方法?考虑这段代码:

private class TargetRC {
    public RComponent rc;

    public TargetRC(RComponent e) {
        rc = e;
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof RComponent)
            return o == rc;
        else
            return o == this;
    }
}

private ArrayList<TargetRC> list = new ArrayList<TargetRC>();

public void add(RComponent e) {
    list.add(new TargetRC(e));
    System.out.println(list.contains(e));
}

如你所见:

  • 对称,因为 o == rc 当且仅当 rc == o 时

  • 自反,因为 rc == rc

用于比较的任何 RComponent。

通过这里的可见add 方法添加任何元素总是打印错误。没有 printlnequals 方法内工作。将 == 运算符更改为 equals 没有任何区别。这里有什么问题?

【问题讨论】:

  • 你的equals不是对称的,除非你重写RComponent.equals()来匹配它。

标签: java arraylist equals


【解决方案1】:

你测试

list.contains(e)

eRComponent。 所以列表为列表中的每个元素调用RComponent.equals(Object) 总是返回false

【讨论】:

    【解决方案2】:

    好的,我唯一要做的就是像这样覆盖 ArrayList 的 indexOf 方法:

    private ArrayList<TargetRC> list = new ArrayList<TargetRC>(){
        @Override
        public int indexOf(Object o){
            for(int i=0; i<size(); ++i){
                if(get(i).equals(o)) return i;
            }
            return -1;
        }
    };
    

    【讨论】:

    • 请注意,这是一种严重的代码异味,可能会导致以后出现问题。不要让您的equals 方法接受不同类型的对象并具有神奇的属性,而是直接编写for 循环以将rc 属性与另一个RComponent 进行比较。
    猜你喜欢
    • 2014-07-22
    • 2023-03-22
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多