前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java集合:关于 HashSet 的内容盘点

Java集合:关于 HashSet 的内容盘点

作者头像
栗筝i
发布2022-12-01 20:40:06
3460
发布2022-12-01 20:40:06
举报
文章被收录于专栏:迁移内容迁移内容

哈希表存放的是哈希值, HashSet 存储元素的顺序并不是按照存入时的顺序(和 List 显然不同) 而是按照哈希值来存的所以取数据也是按照哈希值取得。 ~ 本篇内容包括:HashSet 概述、HashSet 与 HashMap 的关系以及HashSet 的使用


文章目录


一、HashSet 概述

哈希表存放的是哈希值, HashSet 存储元素的顺序并不是按照存入时的顺序(和 List 显然不同) 而是按照哈希值来存的所以取数据也是按照哈希值取得。元素的哈希值是通过元素的 hashcode 方法来获取的, HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较 equals 方法 如果 equls 结果为 true , HashSet 就视为同一个元素。如果 equals 为 false 就不是同一个元素。哈希值相同 equals 为 false 的元素是怎么存储呢,就是在同样的哈希值下顺延(可以认为哈希值相同的元素放在一个哈希桶中)。也就是哈希一样的存一列。

HashSet 通过 hashCode 值来确定元素在内存中的位置。一个 hashCode 位置上可以存放多个元素。

HashSet 的底层源码特别少,主要是因为 HashSet 的方法基本都是借助 HashMap 的方法来实现的。 HashSet 存储的元素对应 HashMap 的 key,因为 HashMap 不能存储重复的 key,所以 HashSet 不能存放重复元素;由于 HashMap 的 key 是基于 hashCode 存储对象的,所以 HashSet 中存放的对象也是无序的;HashSet 也没有提供 get 方法,可以通过 Iterator 迭代器获取数据。


二、HashSet 与 HashMap

HashSet 是基于 HashMap 实现的,区别就在于在 HashMap 中输入一个键值对,而在 HashSet 中只输入一个值。

Java代码:

代码语言:javascript
复制
private transient HashMap map;

// Constructor - 1
// All the constructors are internally creating HashMap Object.
public HashSet()
{
    // Creating internally backing HashMap object
    map = new HashMap();
}

// Constructor - 2
public HashSet(int initialCapacity)
{
    // Creating internally backing HashMap object
    map = new HashMap(initialCapacity);
}

// Dummy value to associate with an Object in Map
private static final Object PRESENT = new Object();

而 HashSet 类的 add 方法的实现是这样子的,很明显可以看到是调用了 HashMap 里的 put() 方法。而里面的 present 则是常量,就是没用的。

代码语言:javascript
复制
public boolean add(E e) 
{ 
   return map.put(e, PRESENT) == null; 
}

三、HashSet 的使用

1、构造方法

HashSet 提供了五种方式的构造器,其中 4 种是 public 修饰的:

方法名

方法说明

方法名

方法说明

public HashSet()

无参构造方法,完成 map 的创建;

public HashSet(int initialCapacity)

指定初始化大小

public HashSet(int initialCapacity, float loadFactor)

指定初始化大小,和负载因子

public HashSet(Collection)

定集合转化为 HashSet, 完成 map 的创建

HashSet(int initialCapacity, float loadFactor, boolean dummy)

指定初始化大小和负载因子,dummy 无实际意义

2、常用方法

方法名

方法说明

方法名

方法说明

boolean add(E e)

添加一个元素,如果该元素已经存在,则返回true,如果不存在,则返回false

boolean remove(Object o)

删除指定的元素,删除成功返回true

Iterator<E> iterator()

获取hashSet的迭代器

int size()

获得大小

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、HashSet 概述
  • 二、HashSet 与 HashMap
  • 三、HashSet 的使用
    • 1、构造方法
      • 2、常用方法
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档