深入探索Java-HashSet和LinkedHashSet

来源:互联网 发布:澳门4g网络制式频段 编辑:程序博客网 时间:2024/06/06 00:40
1. HashSet概述
   HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。
 
2. HashSet的实现
   对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成
  
/**
     * 以指定的initialCapacity和loadFactor构造一个空的HashSet。
     *
     * 实际底层以相应的参数构造一个空的HashMap。
     * @param initialCapacity 初始容量。
     * @param loadFactor 加载因子。
     */ 
    public HashSet(int initialCapacity, float loadFactor) { 
    map = new HashMap<E,Object>(initialCapacity, loadFactor); 
    } 
    
3. 返回元素
/**
     * 返回对此set中元素进行迭代的迭代器。返回元素的顺序并不是特定的。
     * 
     * 底层实际调用底层HashMap的keySet来返回所有的key。
     * 可见HashSet中的元素,只是存放在了底层HashMap的key上,
     * value使用一个static final的Object对象标识。
     * @return 对此set中元素进行迭代的Iterator。
     */ 
    public Iterator<E> iterator() { 
    return map.keySet().iterator(); 
    } 
    
    
LinkedHashSet

1. LinkedHashSet概述
   LinkedHashSet是具有可预知迭代顺序的Set接口的哈希表和链接列表实现。此实现与HashSet的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序。
   注意,此实现不是同步的。如果多个线程同时访问链接的哈希Set,而其中至少一个线程修改了该Set,则它必须保持外部同步。
 
2. LinkedHashSet的实现
   对于LinkedHashSet而言,它继承与HashSet、又基于LinkedHashMap来实现的。
   LinkedHashSet底层使用LinkedHashMap来保存所有元素,它继承与HashSet,其所有的方法操作上又与HashSet相同,因此    LinkedHashSet 的实现上非常简单,只提供了四个构造方法,并通过传递一个标识参数,调用父类的构造器,底层构造一个LinkedHashMap来实现,在相关操作上与父类HashSet的操作相同,直接调用父类HashSet的方法即可。
   /**
        * 以指定的initialCapacity和loadFactor构造一个新的空链接哈希集合。
        * 此构造函数为包访问权限,不对外公开,实际只是是对LinkedHashSet的支持。
        *
        * 实际底层会以指定的参数构造一个空LinkedHashMap实例来实现。
        * @param initialCapacity 初始容量。
        * @param loadFactor 加载因子。
        * @param dummy 标记。
        */ 
       HashSet(int initialCapacity, float loadFactor, boolean dummy) { 
       map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor); 
       }
0 0
原创粉丝点击