private transient HashMap<E,Object> map; //map集合,HashSet存放元素的容器 private static final Object PRESENT = new Object(); //map,中键对应的value值
HashSet是Set接口的典型实现,HashSet按照Hash算法来存储集合中的元素。存在如下特色:
PRESENT为HashSet类中定义的一个使用static final 修饰的常量,并没有实际的意义,HashSet的add方法调用HashMap的put()方法实现,若是键已经存在,map.put()放回的是旧值,添加失败,若是添加成功map.put()方法返回的是null ,HashSet.add()方法返回true,要添加的元素可做为map中的key 。
对于Hashset而言,它全部的key对应的值都是PRESENT。
LinkedHashSet是HashSet的子类。
相同点:
二者都不能保存重复的数据。
差别点:
一、HashSet不保证集合中元素的顺序(由于用的HashMap保存数据),即不能保证迭代的顺序与插入的顺序一致。
二、LinkedHashSet按照元素插入的顺序进行迭代(由于用的LinkedHashMap保存数据),即迭代输出的顺序与插入的顺序保持一致
调用HashSet的构造器,map = new LinkedHashMap<>(initialCapacity, loadFactor);
全部操做基于map
例:add 内部为map.add();
3、TreeSet
TreeSet的元素支持2种排序方式:天然排序或者根据提供的Comparator进行排序。
一、不能有重复的元素;
二、具备排序功能;
三、TreeSet中的元素必须实现Comparable接口并重写compareTo()方法,TreeSet判断元素是否重复 、以及肯定元素的顺序 靠的都是这个方法;
①对于
Java类库中定义的类,TreeSet能够直接对其进行存储,如String,Integer等,由于这些类已经实现了Comparable接口);
②对于自定义类,若是不作适当的处理,TreeSet中只能存储一个该类型的对象实例,不然没法判断是否重复。
四、依赖TreeMap。
五、相对HashSet,TreeSet的优点是有序,劣势是相对读取慢。根据不一样的场景选择不一样的集合。