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

2022-12-01 20:40:06 浏览数 (1)

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


文章目录
  • 一、HashSet 概述
  • 二、HashSet 与 HashMap
  • 三、HashSet 的使用
    • 1、构造方法
    • 2、常用方法


一、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()

获得大小

0 人点赞