【集合框架】JDK1.8源码分析HashSet LinkedHashSet(八)

一、前言

  分析完了List的两个主要类之后,我们来分析Set接口下的类,HashSet和LinkedHashSet,其实,在分析完HashMap与LinkedHashMap之后,再来分析HashSet与LinkedHashSet,就会变成异常简单,下面开始进行分析。

二、数据结构

  2.1 HashSet数据结构

  老规矩,先上数据结构,因为HashSet底层是基于HashMap 或者 LinkedHashMap实现的,所以HashSet数据结构就是HashMap或者LinkedHashMap的数据结构,因为前面已经分析过了,所以不再累赘。直接看这里,JDK1.8源码分析之HashMap(一) && JDK1.8源码分析之LinkedHashMap(二)

  2.2 LinkedHashSet数据结构

  LinkedHashSet基于LinkedHashMap实现,所以数据结构直接看这里。JDK1.8源码分析之LinkedHashMap(二)

三、源码分析

  3.1 HashSet  

  1. 类的继承关系

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

  2. 类的属性 

public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable
{// 版本序列号static final long serialVersionUID = -5024744406713321676L;// 键值Mapprivate transient HashMap<E,Object> map;// 用作所有键对应的值,键所对应的值都相等private static final Object PRESENT = new Object();
}
View Code

  说明:HashSet中由于只包含键,不包含值,由于在底层具体实现时,使用的HashMap或者是LinkedHashMap(可以指定构造函数来确定使用哪种结构),我们知道HashMap是键值对存储,所以为了适应HashMap存储,HashSet增加了一个PRESENT类域(类所有),所有的键都有同一个值(PRESENT)

  3. 其他分析

  add、contains、remove函数都是基于HashMap或者LinkedHashMap做的操作,之前已经给出源码分析,不再累赘。

  3.2 LinkedHashSet

  1. 类的继承关系  

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

  说明LinkedHashSet继承自HashSet,也实现了一些接口,不再累赘。

  2. 其他说明

  LinkedHashSet会调用HashSet的父类构造函数,让其底层实现为LinkedHashMap,这样就很好的实现了LinkedHashSet所需要的功能。

四、总结

  HashSet、LinkedHashSet与HashMap、LinkedHashMap相对应。分析了HashMap、LinkedHashMap的源码之后,HashSet、LinkedHashSet也就很浅显易懂了。谢谢各位园友观看~

 

  

转载于:https://www.cnblogs.com/leesf456/p/5309809.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/418751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript实现快速排序

快速排序是各大IT公司面试必考算法题之一&#xff0c;正好在百度前端技术学院&#xff08;IFE&#xff09;做任务时遇到一道题&#xff0c;要求可视化一个排序算法的计算过程&#xff0c;我第一时间就想到了用JS手写一个快排算法&#xff0c;正好作为练手。 // 快速排序 functi…

js函数节流

我们知道&#xff0c;js有些事件例如resize&#xff0c;mousemove等是会不间断触发的&#xff0c;例如我们简单的一个scroll事件&#xff1a; function scrollFn(){console.log(1) } window.onscrollscrollFn 我们需要在滚动的时候去做一些事情&#xff0c;如上图可见&#…

前端学习(1841):前端面试题之redux管理状态机制

对Redux基本理解 redux是一个独立专门用于做状态管理的JS库, 不是react插件库它可以用在react, angular, vue等项目中, 但基本与react配合使用作用: 集中式管理react应用中多个组件共享的状态和从后台获取的数据 Redux的工作原理Redux使用扩展 使用react-redux简化redux的编码使…

@DateTimeFormat 和 @JsonFormat 注解

https://blog.csdn.net/zhou520yue520/article/details/81348926

结对开发——返回一个整数数组中最大子数组的和 (首尾相接版)

一、题目及题目要求 题目:返回一个整数数组中最大子数组的和。要求&#xff1a;&#xff08;1&#xff09;输入一个整形数组&#xff0c;数组里有正数也有负数。&#xff08;2&#xff09;数组中连续的一个或多个整数组成一个子数组&#xff0c;每个子数组都有一个和。&#xf…

如何获得select被选中option的value和text

https://blog.csdn.net/zgrkaka/article/details/83382278

JS——阶乘的三种做法(正向逆向递归)

一、正向求阶乘 function factorial(n) {var product 1, i 2;while (i < n) {product * i;}return product;}alert(factorial(4)); 二、逆向求阶乘 function factorial(n) {var product 1;while (n > 1) {product * n;n--;}return product;}alert(factorial(4)); 三、…

ElasticSearch 6.x 学习笔记:12.字段类型

https://blog.csdn.net/chengyuqiang/article/details/79048800

同意按钮,倒计时10秒,同意按钮变为可提交的

HTML代码&#xff1a; 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2 <html xmlns"http://www.w3.org/1999/xhtml">3 <head>4 <meta h…

前端学习(1850)vue之电商管理系统电商系统vue脚手架安装

1. 先下载node.js&#xff0c;下载地址&#xff1a;https://nodejs.org/en/download/ 找个目录保存&#xff0c;解压下载的文件&#xff0c;然后配置环境变量&#xff0c;将下面的路径配置到环境变量中。 安装node 配置进环境变量 检查是否安装完成 2. npm配置 查看npm配置信息…

使用jquery获取url及url参数的方法及定义JQuery扩展方法

1、jquery获取url很简单&#xff0c;代码如下&#xff1a; window.location.href; 其实只是用到了javascript的基础的window对象&#xff0c;并没有用jquery的知识。 2、jquery获取url参数比较复杂&#xff0c;要用到正则表达式&#xff0c;所以学好javascript正则式多么重要的…

前端学习(1851)vue之电商管理系统电商系统vue创建项目

1输入命令vue-ui 2点击创建 3初始化 4手动配置项目 点击创建项目 创建完成 安装插件 点击安装即可 配置插件 点击依赖 安装依赖