这篇文章我只是作为一个简要的分析。
首先可以看看之前写的两篇的博文,只要你熟悉了下面这两个类的源码就显得很简单了!
先来介绍下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来实现的。
分享到:
相关推荐
源码解析jdk7.0集合:HashSet的底层实现原理.pdf
HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...
有序性:LinkedHashSet 中的元素按照插入顺序进行排序,即元素被添加到集合中的顺序被记住。 唯一性:LinkedHashSet 中不允许重复元素,每个元素都必须是唯一的。如果将重复元素添加到 LinkedHashSet 中,后面的...
HashSet、LInkedHashSet的使用和特点
5:LinkedHashSet去重(有序) 从代码和执行结果可以看出,LinkedHashSet 是到目前为止,实现比较简单,且最终生成的新集合与原集合顺序保持一致的实现方法 6:Stream去重(有序) Stream 实现去重功能和其他方法不同的...
源码分析见我博文:http://blog.csdn.net/wabiaozia/article/details/50684556
之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也是说HashSet里面有一个HashMap(适配器模式)。因此本文将重点分析HashMap。 HashMap实现了Map...
主要介绍了Java面试题 从源码角度分析HashSet实现原理?,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
ThinkinginJava之Set接口、HashSet源码学习.pdf
java8 源码 学习笔记(持续更新中) 所有文章均同步发布到微信公众号...LinkedHashSet TreeSet HashSet Concurrent源码系列 待完善 JVM(Java虚拟机) 类加载 垃圾回收算法 JavaConcurrent(Java并发系列) 【Java并发系列】
简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相 等注意,如果要把一个对
ava基础 基础知识 面向对象基础 Java基本数据类型 string和包装类 final关键字特性 Java类和包 抽象类和接口 ...Java集合详解7:HashSet,TreeSet与LinkedHashSet Java集合详解8:Java集合类细节精讲 JavaWeb
Set集合介绍 Set集合的概念 Set集合类似于一个容器,程序把很多对象保存到Set集合中,Set集合对添加顺序不记录,当有重复的对象保存到Set...非同步集合,多线程访问HashSet时,是不安全的,需要通过同步代码保证
一:背景 1. 讲故事 自从这个纯内存项目进了大客户之后,搞得我现在对内存和CPU特别敏感,跑一点数据...了解如何扩容,最好的办法就是翻看HashSet底层源码,最粗暴的入口点就是 HashSet.Add 方法。 从图中可以看到最
HashSet的实现原理 ,HashSet与HashMap的区别 以及 HashSet的底层实现方式
自己写的例子,关于HashSet遍历和HashMap遍历的. 感谢大家参考
Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结
hashset.js 简单的哈希集实现,旨在与前端上的数据库条目一起使用。 如果它具有主键,则将其存储在哈希集中可能是一个好主意。安装 jspm i npm:hashset.jsnpm i hashset.js为什么不设置es6? 因为它不适用于数据库...
简述了HashSet去重原理