• 数据结构(集合)学习之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     }
  • 相关阅读:
    累加和校验算法(CheckSum算法)
    云锵投资 2021 年 09 月简报
    云锵投资 2021 年 08 月简报
    断言与忽略断言
    出现 undefined reference to `cv::String::deallocate()'的解决方法
    about of string
    esp32: A stack overflow in task spam_task has been detected.
    IDEA部署Tomcat报错:No artifacts marked for deployment
    在safari浏览器上使用php导出文件失败
    laravel中使用vue热加载时 Cannot read property 'call' of undefined BUG解决方案
  • 原文地址:https://www.cnblogs.com/Bernard94/p/12318749.html
Copyright © 2020-2023  润新知