这篇文章我只是作为一个简要的分析。
首先可以看看之前写的两篇的博文,只要你熟悉了下面这两个类的源码就显得很简单了!
先来介绍下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来实现的。
分享到:
相关推荐
HashSet作为Java集合框架中一个重要的非同步集合实现,它在JDK 7.0中的底层实现原理是基于HashMap来存储和操作数据的。下面就详细介绍HashSet的实现原理。 首先,HashSet是Set接口的一个实现类,它用于存储唯一性的...
有序性:LinkedHashSet 中的元素按照插入顺序进行排序,即元素被添加到集合中的顺序被记住。 唯一性:LinkedHashSet 中不允许重复元素,每个元素都必须是唯一的。如果将重复元素添加到 LinkedHashSet 中,后面的...
HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...
HashSet、LInkedHashSet的使用和特点
HashSet实现原理分析 ...通过源码分析,我们可以更好地理解HashSet的实现原理,提高自己的编程能力和技术水平。同时,通过HashSet的实现机理,我们可以更好地理解Java集合框架的设计理念和实现机理。
本文主要探讨了三种基于Set接口的实现类:HashSet、LinkedHashSet和TreeSet,它们各自有不同的特性和使用场景。 首先,HashSet是最基础的Set实现,它不保证元素的特定顺序,也不保证在多次操作后保持元素的顺序不变...
5:LinkedHashSet去重(有序) 从代码和执行结果可以看出,LinkedHashSet 是到目前为止,实现比较简单,且最终生成的新集合与原集合顺序保持一致的实现方法 6:Stream去重(有序) Stream 实现去重功能和其他方法不同的...
在JDK 1.6版本的HashSet源码中,可以看到一个内部的HashMap实例`map`,以及一个常量`PRESENT`,用来表示HashMap的value。当添加元素时,实际上是将元素作为key,`PRESENT`作为value存入HashMap中。 在实际使用中,...
除了继承自父类的方法外,HashSet类还定义了一些自己特有的方法,包括: - boolean add(Object o):向HashSet中添加一个元素,如果元素已经存在,则添加失败,方法返回false。 - void clear():移除HashSet中的所有...
源码分析见我博文:http://blog.csdn.net/wabiaozia/article/details/50684556
之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也是说HashSet里面有一个HashMap(适配器模式)。因此本文将重点分析HashMap。 HashMap实现了Map...
如果需要按特定顺序遍历元素,应考虑使用LinkedHashSet。 3. **构造方法**: - 无参构造器:创建一个空的HashSet,底层初始化一个HashMap,初始容量为16,加载因子为0.75。 - 带Collection的构造器:根据传入的...
《自己动手写网络爬虫 Java版》是一本深入浅出的教程,旨在引导读者了解搜索引擎技术并使用Java语言实现自己的网络爬虫项目。通过这本书,你可以掌握如何在互联网上抓取、处理和存储大量数据,进而创建一个功能完备...
HashSet和TreeSet是Java集合框架中的两种重要数据结构,它们都是Set接口的实现类,用于存储不重复的元素。在编程实践中,理解它们的区别和应用场景至关重要。 HashSet是基于HashMap实现的,它不保证元素的顺序,...
本文将深入探讨Java中四个主要的Set实现类:HashSet、LinkedHashSet、TreeSet以及EnumSet。 首先,Set集合的核心特性是不存储重复元素。在尝试通过`add()`方法添加相同元素时,如果集合中已经存在该元素,`add()`...
在Java编程中,HashSet是一个非常重要的集合类,它继承自AbstractSet并实现了Set接口。HashSet不包含重复元素,也不保持元素的顺序。本篇将详细讲解如何利用Java的HashSet类来删除学生对象,以及HashSet的一些核心...
在Java编程中,HashSet是一种不允许存储重复元素的集合,它实现了Set接口。HashSet是通过HashMap来实现的,其底层使用HashMap来保存所有元素。这种实现方式让HashSet的操作非常简单高效,因为HashSet的大部分操作,...
HashSet 是一个基于 HashMap 实现的 Set,LinkedHashSet 继承于 HashSet,並且其内部是通过 LinkedList 来实现的。TreeSet 是一个基于红黑树实现的 Set。 HashMap 是一个基于数组和链表组成的 Map,LinkedHashMap ...
4. **LinkedHashSet实现**:LinkedHashSet继承于HashSet,并且通过维护一条双向链表来记录插入顺序,因此提供了元素插入顺序的保持。它的底层实现是LinkedHashMap,后者是基于HashMap和双向链表的实现。 5. **...