`
boy00fly
  • 浏览: 197722 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

自己动手写写:HashSet、LinkedHashSet源码浅析

阅读更多

这篇文章我只是作为一个简要的分析。

 

首先可以看看之前写的两篇的博文,只要你熟悉了下面这两个类的源码就显得很简单了!

自己动手写写:HashMap源码浅析

自己动手写写:LinkedHashMap源码浅析

 

先来介绍下HashSet吧!

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable

 

一个不包含重复元素的 collection。更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。    

 

通过Set接口的描述可以看得出来Set内部是不能有重复元素的,而HashSet的内部是通过维护一个HashMap来实现的,即放入HashSet的value值均作为HashMap的key值来存储的,这样就可以保证了不重复性,并且HashSet拥有HashMap中响应的某些特性!

 

接下来看LinkedHashSet

public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Serializable

 

 LinkedHashSet是HashSet的一个子类,它与HashSet的不同在于:

具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。
此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。
(如果在 s.contains(e) 返回 true 后立即调用 s.add(e),则元素 e 会被重新插入到 set s 中。)
 

 

我们看一下HashSet的一个构造函数:

/**                                                                    
 * Constructs a new, empty linked hash set.  (This package private     
 * constructor is only used by LinkedHashSet.) The backing             
 * HashMap instance is a LinkedHashMap with the specified initial      
 * capacity and the specified load factor.                             
 *                                                                     
 * @param      initialCapacity   the initial capacity of the hash map  
 * @param      loadFactor        the load factor of the hash map       
 * @param      dummy             ignored (distinguishes this           
 *             constructor from other int, float constructor.)         
 * @throws     IllegalArgumentException if the initial capacity is less
 *             than zero, or if the load factor is nonpositive         
 */                                                                    
HashSet(int initialCapacity, float loadFactor, boolean dummy)          
{                                                                      
    map = new LinkedHashMap<E, Object>(initialCapacity, loadFactor);   
}                                                                      

 

 此构造函数的访问权限是default,即同包下可见!LinkedHashSet就是通过此构造函数,通过维护这一个LinkedHashMap来实现的。

1
2
分享到:
评论

相关推荐

    源码解析jdk7.0集合:HashSet的底层实现原理.pdf

    HashSet作为Java集合框架中一个重要的非同步集合实现,它在JDK 7.0中的底层实现原理是基于HashMap来存储和操作数据的。下面就详细介绍HashSet的实现原理。 首先,HashSet是Set接口的一个实现类,它用于存储唯一性的...

    java集合-LinkedHashSet的使用

    有序性:LinkedHashSet 中的元素按照插入顺序进行排序,即元素被添加到集合中的顺序被记住。 唯一性:LinkedHashSet 中不允许重复元素,每个元素都必须是唯一的。如果将重复元素添加到 LinkedHashSet 中,后面的...

    java集合-HashSet的使用

    HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...

    HashSet、LInkedHashSet的使用和特点

    HashSet、LInkedHashSet的使用和特点

    Java面试题 从源码角度分析HashSet实现原理

    HashSet实现原理分析 ...通过源码分析,我们可以更好地理解HashSet的实现原理,提高自己的编程能力和技术水平。同时,通过HashSet的实现机理,我们可以更好地理解Java集合框架的设计理念和实现机理。

    HashSet,TreeSet和LinkedHashSet的区别1

    本文主要探讨了三种基于Set接口的实现类:HashSet、LinkedHashSet和TreeSet,它们各自有不同的特性和使用场景。 首先,HashSet是最基础的Set实现,它不保证元素的特定顺序,也不保证在多次操作后保持元素的顺序不变...

    List 去重的6种方法(contains、迭代、hashSet、treeSet、linkedHashSet、stream)

    5:LinkedHashSet去重(有序) 从代码和执行结果可以看出,LinkedHashSet 是到目前为止,实现比较简单,且最终生成的新集合与原集合顺序保持一致的实现方法 6:Stream去重(有序) Stream 实现去重功能和其他方法不同的...

    HashSet详解和使用示例_动力节点Java学院整理

    在JDK 1.6版本的HashSet源码中,可以看到一个内部的HashMap实例`map`,以及一个常量`PRESENT`,用来表示HashMap的value。当添加元素时,实际上是将元素作为key,`PRESENT`作为value存入HashMap中。 在实际使用中,...

    hashset类的使用

    除了继承自父类的方法外,HashSet类还定义了一些自己特有的方法,包括: - boolean add(Object o):向HashSet中添加一个元素,如果元素已经存在,则添加失败,方法返回false。 - void clear():移除HashSet中的所有...

    hashset源码

    源码分析见我博文:http://blog.csdn.net/wabiaozia/article/details/50684556

    Java集合框架源码剖析:HashSet 和 HashMap

     之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也是说HashSet里面有一个HashMap(适配器模式)。因此本文将重点分析HashMap。  HashMap实现了Map...

    ThinkinginJava之Set接口、HashSet源码学习.pdf

    如果需要按特定顺序遍历元素,应考虑使用LinkedHashSet。 3. **构造方法**: - 无参构造器:创建一个空的HashSet,底层初始化一个HashMap,初始容量为16,加载因子为0.75。 - 带Collection的构造器:根据传入的...

    自己动手写网络爬虫 Java版

    《自己动手写网络爬虫 Java版》是一本深入浅出的教程,旨在引导读者了解搜索引擎技术并使用Java语言实现自己的网络爬虫项目。通过这本书,你可以掌握如何在互联网上抓取、处理和存储大量数据,进而创建一个功能完备...

    HashSet和TreeSet_围墙之外

    HashSet和TreeSet是Java集合框架中的两种重要数据结构,它们都是Set接口的实现类,用于存储不重复的元素。在编程实践中,理解它们的区别和应用场景至关重要。 HashSet是基于HashMap实现的,它不保证元素的顺序,...

    Java—Set集合详解(HashSet/LinkedHashSet/TreeSet/EnumSet)

    本文将深入探讨Java中四个主要的Set实现类:HashSet、LinkedHashSet、TreeSet以及EnumSet。 首先,Set集合的核心特性是不存储重复元素。在尝试通过`add()`方法添加相同元素时,如果集合中已经存在该元素,`add()`...

    java 利用HashSet删除学生

    在Java编程中,HashSet是一个非常重要的集合类,它继承自AbstractSet并实现了Set接口。HashSet不包含重复元素,也不保持元素的顺序。本篇将详细讲解如何利用Java的HashSet类来删除学生对象,以及HashSet的一些核心...

    HashSet的实现原理

    在Java编程中,HashSet是一种不允许存储重复元素的集合,它实现了Set接口。HashSet是通过HashMap来实现的,其底层使用HashMap来保存所有元素。这种实现方式让HashSet的操作非常简单高效,因为HashSet的大部分操作,...

    Java 72 道面试题及答案.docx

    HashSet 是一个基于 HashMap 实现的 Set,LinkedHashSet 继承于 HashSet,並且其内部是通过 LinkedList 来实现的。TreeSet 是一个基于红黑树实现的 Set。 HashMap 是一个基于数组和链表组成的 Map,LinkedHashMap ...

    Java基础学习25.pdf

    4. **LinkedHashSet实现**:LinkedHashSet继承于HashSet,并且通过维护一条双向链表来记录插入顺序,因此提供了元素插入顺序的保持。它的底层实现是LinkedHashMap,后者是基于HashMap和双向链表的实现。 5. **...

Global site tag (gtag.js) - Google Analytics