【问题标题】:equals for arrayList is not being called, ever永远不会调用 arrayList 的等于
【发布时间】:2014-07-07 20:00:19
【问题描述】:

我有 Client 类,其中包含 Category 对象的 ArrayList。因此,当我想确保存在某种类别对象时(我的意思是类别名称相同),我为类别数组列表调用 .contains() 方法。

我在 Category 类中重写了 .equals() 方法,如下所示:

@Override
public boolean equals(Object object) {
    boolean isEqual = false;
    Log.d("Category", "IT WORKS");
    if (object != null && object instanceof Category) {
        isEqual = (this.name == ((Category) object).getName());
    }

    return isEqual;
}

但是在我能够看到的控制台中,永远不会调用 equals 方法。 为什么会这样?

【问题讨论】:

  • name 是字符串吗?如果是这样,您应该使用equals 而不是==。此外,您不需要检查null,因为null instanceof SomeClass 无论如何都会返回false。这些东西不能解决你的问题,但它们值得一看。
  • 尝试调试它肯定会调用,+ 你的equals() 中有一个错误,这里isEqual = (this.name == ((Category) object).getName()); 我假设name 属于String,你使用== 而不是@987654332 @
  • 您是否也重写了 getHashCode()?你必须在覆盖 equals() 的时候一直这样做。
  • @Matt 为什么要 hashcode()ArrayList
  • @Jigar 有点反射,我猜。我想你是对的——ArrayList 不太可能使用 hashCode()。我将其视为一般建议 - 如果没有 hashCode(),equals() 迟早会出现问题。

标签: java arraylist contains


【解决方案1】:

来自JavaDoc

boolean contains(Object o)
如果此列表包含 指定元素。
更正式地,返回true 当且仅当 列表至少包含一个元素e,使得(o==null ? e==null : o.equals(e))
指定者:contains 在接口 Collection<E>

因此,当您调用 list.contains(o) 时,equals 会在 o 而不是列表元素上调用。

类似

boolean contains(o)
{
    for every e in list loop
        if o.equals(e)
            return true
    end loop
    return false
}

根据您调用contains 的方式及其参数,被调用的等号可能在一个完全不同的类中(参数中的对象)。

【讨论】:

    【解决方案2】:

    我是这样测试的,

    static class Category {
        public Category(String name) {
            this.name = name;
        }
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        @Override
        public boolean equals(Object o) {
            if (o != null && o instanceof Category) {
                return this.getName().equals(((Category) o).getName());
            }
            return false;
        }
    }
    
    public static void main(String[] args) {
        List<Category> al = new ArrayList<>();
        al.add(new Category("test"));
        System.out.println(al.contains(new Category("test")));
    }
    

    输出是

    true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-30
      • 2011-10-27
      • 2021-04-15
      • 2014-11-01
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多