黑马程序员技术交流社区

标题: 关于ArrayList的问题,求解?急!!! [打印本页]

作者: ~IN_HAND~    时间: 2013-10-27 13:50
标题: 关于ArrayList的问题,求解?急!!!
本帖最后由 ~IN_HAND~ 于 2013-10-27 23:50 编辑

并不是什么大问题,但是我始终没搞明白。。。下面这个程序是利用ArrayList集合不断增加元素,重复的元素要筛选掉。

废话不多说,直接上代码import java.util.*;
class ArrayListTest0
{
        public static void main(String[] args)
        {
                ArrayList a1 = new ArrayList();
                a1.add(new Person("jia",23));
                a1.add(new Person("jia",22));
                a1.add(new Person("zheng",22));
                a1.add(new Person("jia",23));

                a1 = singleElements(a1);
                //问题就出在这个地方了,调用此方法,在程序的输出结果中就会输出Person类中equals方法中的那句话,
                //但是,令我费解的是,如果不调用此方法的话,为什么就不调用equals方法了呢?输出中没有啊?!
                //我对equals的理解,集合在增加元素时会调用equals方法,我理解错了吗?


                Iterator it = a1.iterator();
                while(it.hasNext())
                {
                        Person p = (Person)it.next();
                        String name = p.getName();
                        int age = p.getAge();
                        System.out.println("name: "+name+"  "+"age: "+age);
                }
        }

        public static ArrayList singleElements(ArrayList list)
        {
                ArrayList ls = new ArrayList();
                Iterator it = list.iterator();
                while(it.hasNext())
                {
                        Object obj = it.next();
                        if(!ls.contains(obj))
                                ls.add(obj);
                }
                return ls;
        }
}
class Person
{
        private String name;
        private int age;
        public Person(String name,int age)
        {
                this.name = name;
                this.age = age;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
        
        public boolean equals(Object obj)
        {
                if(!(obj instanceof Person))
                        return false;
                Person p = (Person)obj;
                System.out.println(this.name+"......."+p.name);
                return this.name.equals(p.name) && this.age == p.age;
        }
}


求高人指点迷津!!!





作者: Jim-剣◆﹏    时间: 2013-10-27 14:00
没错,最关键的一步i大概没写出来
就是元素的类要覆写equals()方法,自定义元素比较的标准,否则equals()使用的则是继承Object类的,比较内存地址值

作者: ~IN_HAND~    时间: 2013-10-27 14:04
Jim-剣◆﹏ 发表于 2013-10-27 14:00
没错,最关键的一步i大概没写出来
就是元素的类要覆写equals()方法,自定义元素比较的标准,否则equals()使 ...

不好意思,刚才由于编辑问题,代码没贴全,您再看看
作者: linjl_ll    时间: 2013-10-27 14:25
首先ArrayList这个集合是可以存放重复的元素的在调用add方法时是不会调用被添加元素的equals方法的(你可以对比下和set集合的区别)。那么equals是在哪调用的呢?看上面代码有一段: public static ArrayList singleElements(ArrayList list)
        {
                ArrayList ls = new ArrayList();
                Iterator it = list.iterator();
                while(it.hasNext())
                {
                        Object obj = it.next();
                        if(!ls.contains(obj))
                                ls.add(obj);
                }
                return ls;
        }
}
这里面的contain里面调用了参数传递的对象的equals方法和ls集合里面的元素进行对比。建议你补一下集合的内容。
作者: ~IN_HAND~    时间: 2013-10-27 16:02
linjl_ll 发表于 2013-10-27 14:25
首先ArrayList这个集合是可以存放重复的元素的在调用add方法时是不会调用被添加元素的equals方法的(你可以 ...

原来如此!!主要是刚开始一直不明白到底是哪句代码执行时调用了equals方法。好了,明白了。
哥们儿~谢啦!
作者: To    时间: 2013-10-27 16:44
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html




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