A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一顿一只牛 中级黑马   /  2014-8-8 22:48  /  2072 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 一顿一只牛 于 2014-8-9 10:21 编辑

         //去除重复元素。
        public static ArrayList quChong(ArrayList al){
                 //定义一个临时容器。
                ArrayList a2 = new ArrayList();
                Iterator it = al.iterator();
                while(it.hasNext()){
                        Object obj = it.next();
                                if(!a2.contains(obj))
                                        a2.add(obj);
                }
                return a2;
        }

         //自定义比较方法,比较名字和年龄。
                public boolean equals(Object obj){
                        if(!(obj instanceof Person))
                                return false;
                        Person p = (Person)obj;
                        return this.name.equals(p.name) && this.age == p.age;
                }
请问大神,自定义的equals方法是在if(!a2.contains(obj))语句中调用了吗?

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 自己试比问来得快

查看全部评分

11 个回复

倒序浏览
   public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }
    public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))   //1
                    return i;
        }
        return -1;
    }
这是底层实现代码
1 这里用的eq是调用了父类的Object  中的eq方法
   public boolean equals(Object obj) {
        return (this == obj);
    }
所有类的父类都是
当你重写了eq方法后会多态到你重写的eq方法中   
请问大神,自定义的equals方法是在if(!a2.contains(obj))语句中调用了吗?  是的

但是  
    public static ArrayList quChong(ArrayList al){
                 //定义一个临时容器。
                ArrayList a2 = new ArrayList();
                Iterator it = al.iterator();
                while(it.hasNext()){
                        Object obj = it.next();
                                if(!a2.contains(obj))
                                        a2.add(obj);
                }
                return a2;
        }
既然是去重   是不是要考虑  把集合里的东西先清空

点评

排版弄好,  发表于 2014-8-9 20:45

评分

参与人数 1技术分 +1 收起 理由
张然龙 + 1 淡定

查看全部评分

回复 使用道具 举报
李林_ 发表于 2014-8-9 00:19
public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }

why清空。 我们不是new了一个新的ArrayList了吗?
新建一个集合把旧集合没有重复的元素放在一起不就行了嘛?用contains判断
   然后我现在想问的是我们自定义的equasl方法是在quChong方法中调用的吗?
回复 使用道具 举报
这个真不懂,受教了
回复 使用道具 举报
List 中 contains remove判断元素相同 底层调用了 equals方法 。
contains(Object o)
如果此列表中包含指定的元素,则返回 true。更确切地讲,当且仅当此列表包含至少一个满足 (o==null ? e==null : o.equals(e)) 的元素 e 时,则返回 true。
详见:毕老->第14天javaAPI->集合框架(ArrayList练习2)视频16分20秒

评分

参与人数 1技术分 +1 收起 理由
张然龙 + 1 淡定

查看全部评分

回复 使用道具 举报
虽然不懂,但是也快了!谢谢
回复 使用道具 举报
地狱天堂 发表于 2014-8-9 02:15
List 中 contains remove判断元素相同 底层调用了 equals方法 。
contains(Object o)
如果此列表中包含指定 ...

{:2_36:} 谢大神指点。
回复 使用道具 举报
楼主舍近求远,直接将元素存入HashSet集合不就欧了么!存入HashSet集合会调用hashCode和equals方法保证唯一性
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
路过~~~~
回复 使用道具 举报
2楼回答 不错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马