【问题标题】:Do I use list.remove correctly?我是否正确使用 list.remove ?
【发布时间】:2013-11-02 01:23:46
【问题描述】:

假设我知道列表 SomeList 包含 thatObj。以下代码是否从 SomeList 中删除了对 thatObj 的引用?

SomeClass el = (SomeClass) thatObj.clone();
SomeList.remove(el);

如果此方法以某种方式比较对象,则无法通过引用找到。直觉建议它应该使用 Object.equals 如果引用指向同一个对象,则返回 true,因此此代码将不起作用。

如果没有,那么还有一个问题:如果没有引用但知道相关对象的所有成员,如何从列表中删除?

【问题讨论】:

  • 你的直觉是完全正确的(除非你覆盖equals())。
  • Object.equals 不考虑引用,它考虑了 equals 实现,它恰好是标准地使用引用。如果你用你自己有意义的实现覆盖equals,你可以删除具有不同引用的相同数据的对象。
  • 谢谢!你知道这是在哪里准确描述的吗,因为 Oracle 文档对此含糊不清?
  • @IgorTraskunov:文档明确声明使用了equals(o==null ? get(i)==null : o.equals(get(i)))docs.oracle.com/javase/7/docs/api/java/util/…

标签: java list object


【解决方案1】:

如果此方法以某种方式比较对象,则无法通过引用找到。直觉建议它应该使用 Object.equals 如果引用指向同一个对象,则返回 true,因此此代码将不起作用。

是的,你是对的。

如果没有,那么还有一个问题:如果没有引用但知道相关对象的所有成员,如何从列表中删除?

两种可能:

  • 覆盖类中的 equals 方法,创建一个包含所有已知成员的新实例,并 call 删除将新创建的实例作为参数传递
  • 遍历列表中的所有对象并删除成员等于您拥有的值的对象

【讨论】:

    【解决方案2】:

    remove 方法在内部使用equals 方法来检查列表中的对象。如果equal返回true,那么它将被删除。覆盖equals 方法将允许正确删除对象。 ArrayList remove 方法的代码供您参考:

     public boolean remove(Object o) {
        if (o == null) {
                for (int index = 0; index < size; index++)
            if (elementData[index] == null) {
                fastRemove(index);
                return true;
            }
        } else {
            for (int index = 0; index < size; index++)
            if (o.equals(elementData[index])) {
                fastRemove(index);
                return true;
            }
            }
        return false;
        }
    

    【讨论】:

      【解决方案3】:

      覆盖类的equals方法-这里是javadoc。另请查看Overriding the java equals() method quirkOverriding equals and hashCode in Java

      【讨论】:

        【解决方案4】:

        通过返回索引搜索列表找到成员,然后获取对象并将其删除。您也可以通过索引将其删除。代码

        SomeList.indexOf() 
        

        可以帮助您获取覆盖equals()hashCode() 的对象的索引。

        【讨论】:

          猜你喜欢
          • 2016-01-24
          • 2014-05-15
          • 2010-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-15
          相关资源
          最近更新 更多