17、集合框架——Set

来源:互联网 发布:淘宝上可以买彩票吗 编辑:程序博客网 时间:2024/06/03 17:07

1、Set集合概述及特点
Collection
    list 有序(存储顺序和取出顺序一致),可重复
    set 无序(存储顺序和取出顺序不一致),唯一

HashSet:它不保证set的迭代顺序,特别是它不保证该顺序恒久不变
注意:虽然Set集合的元素无序,但是,作为集合来说,它肯定有它自己的存储顺序
2、HashSet
A:底层数据结构是哈希表(是一个元素为链表的数组)
B:哈希表底层依赖两个方法:hashCode()和equals()
     执行顺序:
          首先比较哈希值是否相同
                相同:继续执行equals()方法
                    返回true:元素重复了,不添加
                    返回false:直接把元素添加到集合
                不同:就直接把元素添加到集合
1、 存储字符串并遍历
          // 创建集合对象
           HashSet<String> hs = new HashSet<String>();
           // 创建并添加元素
           hs.add("hello");
           hs.add("world");
           hs.add("java");
           hs.add("world");
           // 遍历集合
           for (String s : hs) {
                System.out.println(s);
           }

2、保证元素唯一性的源码解析

3、存储自定义对象并遍历
     
3、LinkedHashSet的概述和使用
LinkedHashSet:底层数据结构由哈希表和链表组成。
哈希保证元素的唯一性。
链表保证元素有序。
4、TreeSet
TreeSet:能够对元素按照某种规则进行排序(基于TreeMap),底层是二叉树结构
排序有两种方式
     A. 自然排序(Comparable)
          无参构造
        
Student.java
public class Student implements Comparable<Student> {private String name;private int age;public Student() {super();}public Student(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;}@Overridepublic int compareTo(Student s) {// 主要条件 姓名的长度int num = this.name.length() - s.name.length();// 姓名的长度相同,不代表姓名的内容相同int num2 = num == 0 ? this.name.compareTo(s.name) : num;// 姓名的长度和内容相同,不代表年龄相同,所以还得继续判断年龄int num3 = num2 == 0 ? this.age - s.age : num2;return num3;}
TreeSetDemo.java 
public class TreeSetDemo {public static void main(String[] args) {// 创建集合对象TreeSet<Student> ts = new TreeSet<Student>();// 创建元素Student s1 = new Student("linqingxia", 27);Student s2 = new Student("zhangguorong", 29);Student s3 = new Student("wanglihong", 23);Student s4 = new Student("linqingxia", 27);Student s5 = new Student("liushishi", 22);Student s6 = new Student("wuqilong", 40);Student s7 = new Student("fengqingy", 22);Student s8 = new Student("linqingxia", 29);// 添加元素ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);ts.add(s7);ts.add(s8);// 遍历for (Student s : ts) {System.out.println(s.getName() + "---" + s.getAge());}}}


     B. 比较器排序 (Comparator)
          带参构造
Studetn.java
public class Student {private String name;private int age;public Student() {super();}public Student(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;}}
TreeSetDemo.java
public static void main(String[] args) {// 创建集合对象// TreeSet<Student> ts = new TreeSet<Student>(); //自然排序// public TreeSet(Comparator comparator) //比较器排序// TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());// 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象// 而匿名内部类就可以实现这个东西TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {@Overridepublic int compare(Student s1, Student s2) {// 姓名长度int num = s1.getName().length() - s2.getName().length();// 姓名内容int num2 = num == 0 ? s1.getName().compareTo(s2.getName()): num;// 年龄int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;return num3;}});// 创建元素Student s1 = new Student("linqingxia", 27);Student s2 = new Student("zhangguorong", 29);Student s3 = new Student("wanglihong", 23);Student s4 = new Student("linqingxia", 27);Student s5 = new Student("liushishi", 22);Student s6 = new Student("wuqilong", 40);Student s7 = new Student("fengqingy", 22);Student s8 = new Student("linqingxia", 29);// 添加元素ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);ts.add(s7);ts.add(s8);// 遍历for (Student s : ts) {System.out.println(s.getName() + "---" + s.getAge());}}}



               1、存储Integer类型的元素并遍历
               2、保证元素排序的源码解析      
                            
               3、TreeSet保证元素排序和唯一性的原理
                    唯一性:是根据比较的返回值是否是0来决定的
                    排序:
                              A:自然排序(元素具备比较性)
                                   让元素所属的类实现自然排序接口Comparable
                              B:比较器排序(集合具备比较性)
                                   让集合的构造方法接收一个比较器接口的子类对象Comparator
               4、存储自定义对象并遍历


5、总结  


原创粉丝点击