moc 发表于 2018-12-26 19:24:21

Java-021集合框架之Set

本帖最后由 moc 于 2018-12-26 22:33 编辑

1、Set简介
Set是一个不包含重复元素的 collection。
① 继承于Collection接口,具有增删查改的方法!
② Set有两个实现类,HashSet 和 TreeSet 。
2、HashSet
① HashSet实现Set接口,底层数据结构哈希表,那么它也是一个不包含重复元素的一个无序的集合,允许使用null,有且仅有一个元素为null!
② HashSet也是一个非同步的方法,如果要在多个线程中使用,要注意进行同步封装!
        Set s = Collections.synchronizedSet(new HashSet(...));
③ HashSet中含有一个”HashMap类型的成员变量”map,HashSet的操作函数,实际上都是通过map实现的。
// 创建集合对象
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);
}为什么存储字符串的时候,字符串内容相同的只存储了一个呢?判断标准是什么?
        e.hash == hash&&((k = e.key) == key || key.equals(k))
标准: 添加元素的哈希值 --->元素的地址值或equals()方法
如果HashSet存储其他类,如果类没有重写这两个方法,默认使用的Object()。一般来说不会相同,会都加入集合。
==> 存储HashSet的类对象需要重写hashCode()和equals()方法。
3、LinkedHashSet
LinkedHashSet继承了HashSet,底层数据结构由哈希表和链表组成。
① 哈希表保证元素的唯一性。
② 链表保证元素有素。(存储和取出是一致)
// 创建集合对象
LinkedHashSet<String> hs = new LinkedHashSet<String>();
// 创建并添加元素
hs.add("hello");
hs.add("world");
hs.add("java");
hs.add("world");
// 遍历
for (String s : hs) {
        System.out.println(s);
}4、TreeSet
基于 TreeMap 的 NavigableSet 实现,底层数据结构为二叉树。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator进行排序,具体取决于使用的构造方法。
排序有两种方式(取决于构造方法)==>A:自然排序&&B:比较器排序
1. 构造方法
TreeSet() ------------------------------------------------->   构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
TreeSet(Collection<? extends E> c) ---------------->    构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。
TreeSet(Comparator<? super E> comparator)---->    构造一个新的空 TreeSet,它根据指定比较器进行排序。
TreeSet(SortedSet<E> s) ------------------------------>   构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。
自然排序:
        如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口。
public int compareTo(T o)---------->比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
Integer等包装类默认重写了上面的方法。---> 从小到大排序。
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;}

        @Override
        public 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;
        }
}TreeSet集合保证元素唯一性的原理:
唯一性 ---->根据比较的返回是否是0来决定。
注意:
① TreeSet中不允许使用null元素!在添加的时候如果添加null,则会抛出NullPointerException异常。
② TreeSet不支持快速随机遍历,只能通过迭代器进行遍历!

zwhe 发表于 2020-6-5 11:05:27

{:7_146:}
页: [1]
查看完整版本: Java-021集合框架之Set