1. LinkedHashSet概述

LinkedHashSet是具有可预知迭代顺序的Set接口的哈希表和链接列表实现。此实现与HashSet的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序。
      注意,此实现不是同步的。如果多个线程同时访问链接的哈希Set,而其中至少一个线程修改了该Set,则它必须保持外部同步。

2. LinkedHashSet的实现

对于LinkedHashSet而言,它继承与HashSet、又基于LinkedHashMap来实现的。
      LinkedHashSet底层使用LinkedHashMap来保存所有元素,它继承与HashSet,其所有的方法操作上又与HashSet相同,因此LinkedHashSet 的实现上非常简单,只提供了四个构造方法,并通过传递一个标识参数,调用父类的构造器,底层构造一个LinkedHashMap来实现,在相关操作上与父类HashSet的操作相同,直接调用父类HashSet的方法即可。LinkedHashSet的源代码如下:

  1. public class LinkedHashSet<E>
  2. extends HashSet<E>
  3. implements Set<E>, Cloneable, java.io.Serializable {
  4. private static final long serialVersionUID = -2851667679971038690L;
  5. /**
  6. * 构造一个带有指定初始容量和加载因子的新空链接哈希set。
  7. *
  8. * 底层会调用父类的构造方法,构造一个有指定初始容量和加载因子的LinkedHashMap实例。
  9. * @param initialCapacity 初始容量。
  10. * @param loadFactor 加载因子。
  11. */
  12. public LinkedHashSet(int initialCapacity, float loadFactor) {
  13. super(initialCapacity, loadFactor, true);
  14. }
  15. /**
  16. * 构造一个带指定初始容量和默认加载因子0.75的新空链接哈希set。
  17. *
  18. * 底层会调用父类的构造方法,构造一个带指定初始容量和默认加载因子0.75的LinkedHashMap实例。
  19. * @param initialCapacity 初始容量。
  20. */
  21. public LinkedHashSet(int initialCapacity) {
  22. super(initialCapacity, .75f, true);
  23. }
  24. /**
  25. * 构造一个带默认初始容量16和加载因子0.75的新空链接哈希set。
  26. *
  27. * 底层会调用父类的构造方法,构造一个带默认初始容量16和加载因子0.75的LinkedHashMap实例。
  28. */
  29. public LinkedHashSet() {
  30. super(16, .75f, true);
  31. }
  32. /**
  33. * 构造一个与指定collection中的元素相同的新链接哈希set。
  34. *
  35. * 底层会调用父类的构造方法,构造一个足以包含指定collection
  36. * 中所有元素的初始容量和加载因子为0.75的LinkedHashMap实例。
  37. * @param c 其中的元素将存放在此set中的collection。
  38. */
  39. public LinkedHashSet(Collection<? extends E> c) {
  40. super(Math.max(2*c.size(), 11), .75f, true);
  41. addAll(c);
  42. }
  43. }

在父类HashSet中,专为LinkedHashSet提供的构造方法如下,该方法为包访问权限,并未对外公开。

  1. /**
  2. * 以指定的initialCapacity和loadFactor构造一个新的空链接哈希集合。
  3. * 此构造函数为包访问权限,不对外公开,实际只是是对LinkedHashSet的支持。
  4. *
  5. * 实际底层会以指定的参数构造一个空LinkedHashMap实例来实现。
  6. * @param initialCapacity 初始容量。
  7. * @param loadFactor 加载因子。
  8. * @param dummy 标记。
  9. */
  10. HashSet(int initialCapacity, float loadFactor, boolean dummy) {
  11. map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
  12. }

由上述源代码可见,LinkedHashSet通过继承HashSet,底层使用LinkedHashMap,以很简单明了的方式来实现了其自身的所有功能。

LinkedHashSet的实现原理的更多相关文章

  1. LinkedHashSet 的实现原理

    原文:http://wiki.jikexueyuan.com/project/java-collection/linkedhashset.html LinkedHashSet 概述 思考了好久,到底要 ...

  2. ArrayList的实现原理--转

    1. ArrayList概述: ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些方法来操作内部 ...

  3. Java源码分析系列

    1) 深入Java集合学习系列:HashMap的实现原理 2) 深入Java集合学习系列:LinkedHashMap的实现原理 3) 深入Java集合学习系列:HashSet的实现原理 4) 深入Ja ...

  4. Java基础知识点(二)

    前言:Java的基础知识点不能间断. 1.Array和ArrayList的区别 关于Array的用法,参看:http://blog.csdn.net/b_11111/article/details/5 ...

  5. Java 容器源码分析之Map-Set-List

    HashMap 的实现原理 HashMap 概述 HashMap 是基于哈希表的 Map 接口的非同步实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.此类不保证映射的顺序 ...

  6. Java基础知识介绍

    数组的定义及初始化方式 数组对象创建没有() 一维数组 静态初始化: String[] books = {"Thinking in Java","Effective Ja ...

  7. Java 总结 数据底层原理 【包括 ArrayList、LinkedList、hash table、HashMap、Hashtable、ConcurrentHashMap、hash code、HashSet、LinkedHashMap、LinkedHashSet】

    1.ArrayList (1)底层是由动态数组实现的[使用了List接口]. (2)动态数组是长度不固定,随着数据的增多而变长. (3)如果不指定,默认长度为10,当添加的元素超过当前数组的长度时,会 ...

  8. Spring:源码解读Spring IOC原理

    Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...

  9. HashSet 与TreeSet和LinkedHashSet的区别

    Set接口      Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.      Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就 ...

随机推荐

  1. 通过WebApi取出XML数据

    Get请求: public static Result<GetExpressCollectionResponseType> GetDataFromWebs(string waybillNu ...

  2. (用微信扫的静态链接二维码)微信native支付模式官方提供的demo文件中的几个bug修正

    native支付模式一demo(用微信扫的静态链接二维码)BUG修复,一共4个BUG 1.native_call_qrcode.php这个文件中的代码无法生存native支付的短地址2.WxPayPu ...

  3. Yii Query Builder insert()、update()、delete()使用

    Yii自带的query builder还是很好用的,省去了拼sql的过程,今天在写一个语句的时候遇到这样一个问题 $connection = Yii::app()->db; $command = ...

  4. Delphi XE2及以后的版本编译后的程序大小问题

    说说Delphi XE2及以后的版本编译后的程序大小问题. 其实最终得到的程序并不大,由于编译器的变化,XE2里Debug版程序比Release版程序大很多,要减小程序体积,就使用Release版.下 ...

  5. python AES 加密与解密

    #用aes加密,再用base64 encode def aes_encrypt(data): from Crypto.Cipher import AES import base64 key=setti ...

  6. 微信开发之开发环境搭建( visual studio 2015we + IIS express + ngrok)

    1. 申请个人测试使用的微信订阅号 https://mp.weixin.qq.com 可注册微信订阅号. 不会?请自行百度. 2. 安装 ngrok 微信开发首先要解决如何让微信链接到本地开发环境.有 ...

  7. 一步步学习NHibernate(4)——多对一,一对多,懒加载(1)

    请注明转载地址:http://www.cnblogs.com/arhat 通过上一章的学习,我们学会如何使用NHibernate对数据的简单查询,删除,更新和插入,那么如果说仅仅是这样的话,那么NHi ...

  8. Python创建list

    Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ['Mic ...

  9. 基于Mahout的电影推荐系统

    基于Mahout的电影推荐系统 1.Mahout 简介 Apache Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域 ...

  10. c++ 类的对象与指针

    这里首先我们需区分一下指针数组和数组指针. 指针数组:int *p[4];它最终是个数组,只是这个数组存储的是4个指向int类型的指针. 数组指针:int (*P)[4];它最终是个指针,表示一个指向 ...