原理:

HashSet实现了Set接口,但是内部实现却是基于HashMap的。它的原理就是添加到集合里的值或者对象都成为了HashMap的key. 而HashMap有了Key之外,值怎么办呢。HashSet默认提供了一个供所有key共享的一个Object对象PRESENT.什么意思呢?下面会分析到。

也正是HashSet是基于HashMap的,那么我们知道HashMap的key允不允许重复,是不允许的嘛,判断依据equals是否相等,而且hashCode是否一样。既然HashMap的key不允许相等,就决定了添加到HashSet的值是不能相等的。

HashSet重要的属性

private transient HashMap<E,Object> map;

// 提供了一个供所有key共享的一个Object对象

private static final Object PRESENT =new Object();

构造方法:

public HashSet() {

map = newHashMap<>();

}

public HashSet(Collection<? extends E> c) {

map = newHashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));

addAll(c);

}

public HashSet(int initialCapacity, floatloadFactor) {

map = newHashMap<>(initialCapacity, loadFactor);

}

HashSet重要方法

public boolean add(E e) {

return map.put(e, PRESENT)==null;

}

我们每添加一个元素E到HashSet,其实就是在HashMap里面存了一个

<KEY=E,VALUE= PRESENT>

public Iterator<E> iterator() {

return map.keySet().iterator();

}

public boolean remove(Object o) {

return map.remove(o)==PRESENT;

}

public int size() {

return map.size();

}

public boolean contains(Object o) {

return map.containsKey(o);

}

从上面的方法得知,其实就是对HashMap进行的一些操作而已。

HashSet和 HashMap有啥异同

  • HashSet实现的是Set接口;HashMap实现的是Map接口
  • HashSet只是存储单个元素;HashMap存储的是键值对
  • HashSet的值允许为空,但只允许一个,添加再多的null对象,其实只不过覆盖了之前的那个对象而已;HashMap允许键值为空,但是键只允许一次

JDK1.8 HashSet相关推荐

  1. JavaSE学习笔记 详解Set集合中实现类:LinkedHashSet以及TreeSet

    详解Set集合中实现类:LinkedHashSet以及TreeSet 1.LinkedHashSet概述 2.TreeSet概述 2.1 自然排序 2.1.1 TreeSet存储常见引用数据类型 2. ...

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

    一.前言 分析完了List的两个主要类之后,我们来分析Set接口下的类,HashSet和LinkedHashSet,其实,在分析完HashMap与LinkedHashMap之后,再来分析HashSet ...

  3. HashSet源码分析 jdk1.6

    Set的特点:Set元素无顺序,且元素不可以重复. 1.定义 public class HashSet<E> extends AbstractSet<E> implements ...

  4. HashSet及LinkedHashSet源码分析(基于JDK1.6)

    Java容器类的用途是"保存对象",分为两类:Map--存储"键值对"组成的对象:Collection--存储独立元素.Collection又可以分为List和 ...

  5. Java集合深入学习 - HashSet源码解析(基于jdk1.8)

    HashSet...感觉就像是一个阉割版的HashMap.. /*** 定义HashSet类 继承 AbstractSet 实现Set,Cloneable,Serializable*/ public ...

  6. HashSet源码解析——基于JDK1.8

    前言 HashSet 是一个不允许存储重复元素的集合,它的实现比较简单,只要理解了 HashMap,HashSet 就水到渠成了.当然了解HashMap可以参考我的这篇文章 1 常量介绍 //使用Ha ...

  7. 一次 HashSet 所引起的并发问题

    作者:crossoverJie,GitHub 热门开源作者 来自:https://crossoverjie.top 背景 上午刚到公司,准备开始一天的摸鱼之旅时突然收到了一封监控中心的邮件. 心中暗道 ...

  8. JDK1.5 新特性

    Java 5.0发布了,许多人都将开始使用这个JDK版本的一些新增特性.从增强的for循环到诸如泛型(generic)之类更复杂的特性,都将很快出现在您所编写的代码中.我们刚刚完成了一个基于Java ...

  9. Day 6:Vector类和实现Hashset以及登录窗口的模拟

    LinkedList作业:生成扑克牌并且洗牌? import java.util.*;class Poker{String color;String number;public Poker(Strin ...

最新文章

  1. python3 配置文件操作库 configparser 读取配置文件后 元组列表转字典
  2. android缓存之Lrucache 和LinkedHashMap
  3. leetcode 764. Largest Plus Sign | 764. 最大加号标志(Java)
  4. ios 高德获取定位_解决ios11不支持高德地图API定位功能的方法
  5. ZZULIOJ 计算两点间的距离(多实例测试)
  6. 书评专家_书评:“开放”探讨开放的广泛文化含义
  7. epplus word html,EPPlus简介
  8. 编辑距离(线性DP+暴力匹配)
  9. 小程序 java在线考试系统python自动阅卷系统php自动组卷系统
  10. python进销存课程_蜗牛笔记-文章-蜗牛进销存项目实战(一)
  11. 楚纳电动车禁入电梯管控系统-电梯阻车原理
  12. 对讲机扫盲的基本常识
  13. java获取某年度有多少周_java获取一年共有多少周
  14. oracle18c创建数据库,Oracle 18C 手工创建CDB
  15. 三国群英传M玩亚服好还是台服好?服务器选择推荐
  16. 用开源的协同办公OA项目,做一个考勤系统
  17. 阿里云服务器是干什么用的?
  18. win10+cuda10.0+pytorch安装
  19. 从零开始在云服务器上搭建个人博客
  20. C语言中的void*是什么?

热门文章

  1. 全能直播王pc版_企鹅游戏直播助手v2.28.330.8-企鹅游戏直播助手PC版下载
  2. Oscache 概述
  3. 2012年美国计算机研究生排名,2012年美国研究生留学 计算机专业院校排名TOP50
  4. PostgreSQL12主从流复制(一主两从)
  5. jl计算机二级c语言考什么,计算机等级考试二级C语言考前密卷(9)2
  6. android 让dialog保持在最前_Android 面试进阶指南 —— 唠唠任务栈,返回栈和启动模式...
  7. 上海计算机和金融专业,姚明:我将去上海交大读书 选择计算机金融专业
  8. oel6mysql_OEL6.5_X86平台部署Oracle 11gR2 RAC并配置ACFS
  9. python代码中添加环境变量
  10. java反射 获取变量值_Java反射:如何获取变量的名称?