黑马程序员技术交流社区

标题: remove为什么会依赖元素中的equals方法 [打印本页]

作者: 赵国刚    时间: 2013-8-14 22:33
标题: remove为什么会依赖元素中的equals方法
本帖最后由 赵国刚 于 2013-8-15 18:34 编辑

import java.util.*;
class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                this.name = name;
                this.age = age;
        }
        
        public boolean equals(Object obj)
        {
                Person p = (Person)obj;
                return this.name.equals(p.name) && this.age == p.age;
        }
}
class ArrayListTest
{
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
        public static void main(String[] args)
        {
                ArrayList al = new ArrayList();
                al.add(new Person("lisi03",33));
                sop(al.remove(new Person("lisi03",33)));
                //remove方法底层也是依赖于元素的equals方法。
        }
}
remove方法底层也是依赖于元素的equals方法。什么意思?结果为何为true


作者: sergio    时间: 2013-8-15 00:10
public boolean remove(Object o)移除此列表中首次出现的指定元素(如果存在)。如果列表不包含此元素,则列表不做改动。更确切地讲,移除满足 (o==null ? get(i)==null : o.equals(get(i))) 的最低索引的元素(如果存在此类元素)。如果列表中包含指定的元素,则返回 true(或者等同于这种情况:如果列表由于调用而发生更改,则返回 true)。
作者: kmter    时间: 2013-8-16 23:30
这应该是毕向东老师Java基础教学视频中的代码吧?
当调用了remove方法, java会首先调用该方法导入的参数对象的equals方法, 从下标为0的元素开始依次判断是否相同, 若equals返回true则删除该元素并返回true.
不过有一种特殊情况, 就是导入的参数对象为null时, java会依次寻找列表中同样为null的元素然后删除该元素, 与上面的原理相同.
所以, 这里remove方法返回的true表达的意思有两种. 一, 是我(java)在列表中找到了这个元素, 二, 我在列表中删除了这个元素.
下面是ArrayList中remove方法的实现代码:
  1.     public boolean remove(Object o) {
  2.         if (o == null) {
  3.             for (int index = 0; index < size; index++)
  4.                 if (elementData[index] == null) {
  5.                     fastRemove(index);
  6.                     return true;
  7.                 }
  8.         } else {
  9.             for (int index = 0; index < size; index++)
  10.                 if (o.equals(elementData[index])) {
  11.                     fastRemove(index);
  12.                     return true;
  13.                 }
  14.         }
  15.         return false;
  16.     }
复制代码
这里我又要提出一个疑问了, 这样实现的话, 在列表中包含大量相同元素时调用了remove方法岂不是只能删除最靠前的仅一个元素?求大牛指教




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2