黑马程序员技术交流社区

标题: list.contains(Object xxxxx) 中底层的实现细节问题. [打印本页]

作者: boom_pm2.5    时间: 2016-11-18 23:32
标题: list.contains(Object xxxxx) 中底层的实现细节问题.
上干货~

有一道题,他是这样子的,
如果我一个集合中有重复的元素, 那么请问,我怎么设计代码.能拿到一个没有重复的集合呢???

思路:
在定义一个集合,这个集合中,放的就是 去重过后的元素,里面没有重复的 元素.
整一个循环出来,三种方法你随便写,
然后在这个 集合中,我每次 对拿进来的元素进行判断,看你是否包含在我 当前集合中,,
如果包含,我就 list.add(); 来添加你, 如果我中间有了,那就不要你了'

--------------------------------------------------------------------------------------------------------------手动分割线.
代码区.

测试类代码:
import java.util.ArrayList;
import java.util.List;

import com.heima.bean.Person;

public class 第二题 {
        public static void main(String[] args) {
                List <Person>list1 = new ArrayList<Person>();
                list1.add(new Person("漩涡鸣人",18));
                list1.add(new Person("漩涡鸣人",18));
                list1.add(new Person("日向雏田",16));
                list1.add(new Person("宇智波佐助",19));
                list1.add(new Person("宇智波佐助",19));
                list1.add(new Person("宇智波佐助",19));
                list1.add(new Person("长门",50));
                list1.add(new Person("长门",50));
                list1.add(new Person("长门",50));
                List <Person>list2 = new ArrayList<Person>();
               
                for (int i = 0; i < list1.size(); i++) {
                        if (!list2.contains(list1.get(i))) {
                                list2.add(list1.get(i));
                        }
                }
                System.out.println(list2);
        }
}


------------------------------------------------------------------------------------------------------------手动分割线
Person类 代码区
public class Person {
        private String name;
        private int age;
        public Person() {
                super();
               
        }
        public Person(String name, int age) {
                super();
                this.name = name;
                this.age = age;
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public int getAge() {
                return age;
        }
        public void setAge(int age) {
                this.age = age;
        }
        @Override
        public String toString() {
                return "Person [name=" + name + ", age=" + age + "]";
        }
        @Override
        public boolean equals(Object obj) {
                Person p = (Person)obj;
                return this.name.equals(p.name) && this.age == p.age;
        }       
}

------------------------------------------------------------------------------------------------------------------------------手动分割线.

总结一下.
我创建了两个集合,一个集合负责放入我的全部元素.
另外一个空的集合是准备放入 去重后的元素 的集合

然后通过遍历来 对第一个集合进行遍历,
然后写入if 语句,
使用List.containds(Object obj);
对他进行判断.
如果没有,我就list.add();
没有就让你继续循环就可以 了.

有人已经发现了,我在Person类中,重写了equals 方法,
如果不写equals方法, 那么contains 就会调用 Object 这个超类 的 equals 方法,
底层是用equals 方法实现比较的, Object 中的equals 方法,是比较 地址值的,
我们比较的是 值,所以要重写equals方法.

DO you get it?


作者: boom_pm2.5    时间: 2016-11-18 23:33
题目不难,就是 有个小细节需要注意一下,  contains 底层是在使用 equals 方法,
不重写的话  就会比较地址值. 那就完蛋了.




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