黑马程序员技术交流社区

标题: 集合List和Set的共同点和异同点 [打印本页]

作者: 辉大大    时间: 2015-7-27 21:25
标题: 集合List和Set的共同点和异同点
List和Set的共同点和异同点
    A:元素特点:
                List:元素有序(存储顺序一致),元素可以重复,可通过索引遍历元素,
                Set: 元素无序,唯一;
    B:List的去重复值:
        1、创建两个集合,一个有元素,一个为空,遍历有元素的集合,比较判断为空的集合是否包含被遍历
           集合的元素,有就舍弃,没有就添加,这样就获取了一个没有重复元素的集合

        public static void main(String[] args) {
                //创建集合
                List<Student> list1 = new ArrayList<>();

                List<Student> list2 = new ArrayList<>();
               
                //创建对象
                Student s1 = new Student();
                ..........


                //添加元素
                list1.add(s1);
                ..........

                //遍历集合
                //方法1
                Iterator<Student> it = new list1.iterator();
                while(it.hasNext()) {
                        Student s = (Student)it.next();
                        if(!list2.contains(s)) {
                                list2.add(s);
                        }
                }
               
                // 遍历list2
                for (int x = 0; x < list.size(); x++) {
                        Student s1 = (Student) list2.get(x);
                        System.out.println(s1);
                }
                System.out.println(list2);

        }
       
        2、在使用contains()方法时,底层使用的是Object类的equals()方法,Stduent类中没有重写equals();
           需要在Student类中重写equals()方法。
                 重写equals()方法只需三步:如下
        @Override
        public boolean equals(Object obj) {
               
                if(obj == this) {
                        return true;
                }
               
                //第二:obj不属于Student类型
                if(!obj instanceof Student) {
                        return false;
                }

                Student s = (Student)obj;//强转
                return this.name.equals(s.name) && this.age == s.age;
        }
   C: Set的两个实现类:hashSet和TreeSet
      hashSet:底层数据结构是哈希表,不能保证集合的存取顺序,只能保证元素的唯一。
        1、hashSet是怎么保持元素的唯一
           因为它是通过hashCode()和equals()方法来保持元素的唯一
           当存入元素时,首先调用hashCode()方法获取哈希值,再根据哈希值计算出一个存储位置,如果该位置上
       没值,直接存入;若有,调用equals()方法比较元素的值,相同就丢弃,不同就存入。
           首先,判断hashCode()值。相同返回为0;
                相同:
                  调用equals()方法,根据其返回值:
                        true:说明元素重复,不添加到集合。
                        false:说明元素不重复,添加到集合。
                不同:直接添加到集合。
        2、hashCode()和equals()的重写;
          (注:在开发中,不用写,直接鼠标右键--sourse--hashCode()and equals())
           (1)hashCode():
                把所有的对象的成员变量的值相加
                基本类型:加值; 引用类型:加哈希值
                例:
                public int hashCode() {
                        return this.name.hashCode() + this.age*13 + this.score*11;
                }
           (2)equals()
                同上面List的equals()的重写方法分为三步
                A:if(obj == this) {}
                B:if(!obj instaceof Student) {}
                C:Student s = (Student)obj;
                  return this.name.equals(s.name) + this.age == s.age;
      TreeSet:底层数据结构是二叉树结构,可以保证元素的唯一,也可以保证元素的存取顺序;
        1、TreeSet保证元素的唯一、排序;
           原理:(1)第一个添加的元素作为根节点
                 (2)从第二个添加的元素开始与根节点比较
                       如果大了,放在根节点的右边
                       如果小了,放在......的左边
                       如果相同,丢弃
                 (3)排序原则:左中右原则;
        2、排序:
           (1)自然排序(元素具备比较性),无参构造;
                  要求对象所属的类实现接口Comparable;重写compareTo()方法
                public int compareTo(student s) {
                        int num = this.name.length() - s.name.length();

                        int num1 = (num == 0) ? this.name.equals(s.name) : num;

                        int num2 = (num1 == 0) ? this.age - s.age;
                       
                        return num2;

                }
       
           (2) 比较器排序(集合具有比较器),有参构造;
                 要求构造方法接受一个实现了Comparator接口的对象,重写一个compare()方法
                TreeSet<Student> ts = new TreeSet(new Comparator<Student> {
                        @Overrided
                        public int compare(Student s1, Student s2) {
                                int num = s1.getAge() - s2.getAge();
                                int num1 = (num == 0) ? s1.getName().compareTo(s2.getName()) :num;
                                return num1
                        }
                });
    D:遍历方法:
        List:
          (1)普通Iterator迭代器
          (2)增强for循环
          (3)ListIterator列表迭代器
          (4)普通for循环
        Set:
           (1)普通Iterator迭代器
           (2)增强for循环

       
作者: 胡家兵    时间: 2015-7-27 21:29
写的很好顶一个
作者: 韩侠    时间: 2015-7-27 21:30
写的真好呀
作者: 韩侠    时间: 2015-7-27 21:32
写的不错呀
作者: 娜妞子~    时间: 2015-7-27 21:34
真好~~~大赞
作者: 何时归来看花开    时间: 2015-7-27 21:39
写的不错,赞一个
作者: kkkkkccccc    时间: 2015-7-27 21:40
又复习了一遍.
作者: 朝花夕拾7    时间: 2015-7-27 21:50
不错不错

作者: chaotongyou    时间: 2015-7-27 21:56
顶一下赚个分:)
作者: 水佳伟    时间: 2015-7-27 22:05
楼主好人,长知识了




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