数据结构(集合)学习之Set

集合

框架关系图:

Collection接口下面有三个子接口:List、Set、Queue。此篇是关于Set<E>的简单学习总结。

 补充:HashTable父类是Dictionary,不是AbstractMap。

Set:

Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中(可以存空元素)。常见的子类:HashSet、TreeSet、LinkedHashSet。

1、HashSet(无序,不可重复):

底层实际上是一个无序,不可重复的HashMap,源代码如下:

 

 1     private transient HashMap<E,Object> map;
 2     /**
 3      * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
 4      * default initial capacity (16) and load factor (0.75).
 5      *(默认初始容量是16,加载因子是0.75,元素个数超过16*0.75就扩容)
 6      */
 7     public HashSet() {
 8         map = new HashMap<>();
 9     }
10     public HashSet(Collection<? extends E> c) {
11         map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
12         addAll(c);
13     }

因为Set的无序,不可重复,所以常用来去重。

 1     public static void main(String[] args) {
 2         Set<String> hash = new HashSet<String>();
 3         hash.add("C");
 4         hash.add("A");
 5         hash.add("A");
 6         hash.add("D");
 7         hash.add("B");
 8         hash.add("B");
 9         hash.add("D");
10         hash.add("C");
11         Iterator it = hash.iterator();
12         while (it.hasNext()) {
13             System.out.println(it.next());
14         }
15     }

注意:当HashSet调用add(Object o)时,会把参数当为key,默认一个对象最为value:

1     private static final Object PRESENT = new Object();
2     public boolean add(E e) {
3         return map.put(e, PRESENT)==null;
4     }

2、LinkedHashSet(有序,不可重复):

LinkedHashSet继承HashSet,默认初始容量:16,加载因子:0.75。其实LinkedHashSet就是双向链状的HashSet,因为是链状,所以实现了有序性,但是不可重复。

 1     public static void main(String[] args) {
 2         Set<String> linked = new LinkedHashSet<String>();
 3         linked.add("A");
 4         linked.add("A");
 5         linked.add("C");
 6         linked.add("B");
 7         linked.add("D");
 8         linked.add("A");
 9         linked.add("B");
10         Iterator it = linked.iterator();
11         while (it.hasNext()) {
12             System.out.println(it.next());
13         }
14     }

3、TreeSet(有序,不可重复):

TreeSet底层是TreeMap:

 1 public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable{
 2 
 3     private transient NavigableMap<E,Object> m;
 4 
 5     private static final Object PRESENT = new Object();
 6 
 7     TreeSet(NavigableMap<E,Object> m) {
 8         this.m = m;
 9     }
10 
11     public TreeSet() {
12         this(new TreeMap<E,Object>());
13     }

TreeSet中有个Compare比较器,会对数据进行排序:

 1     public static void main(String[] args) {
 2     Set<String> tree = new TreeSet<>();
 3     tree.add("A");
 4     tree.add("C");
 5     tree.add("A");
 6     tree.add("D");
 7     tree.add("B");
 8         Iterator<String> it = tree.iterator();
 9         while(it.hasNext()){
10             System.out.println(it.next());
11         }
12     }

 

posted @ 2020-02-16 21:08  请别耽误我写BUG  阅读(229)  评论(0编辑  收藏  举报