Java HashSet 的常用方法以及实现原理

本文详细介绍了JavaHashSet集合类的概念,其底层数据结构哈希表,以及各种构造器和常用方法,如添加、删除元素、获取大小和判断元素是否存在等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概念

HashSet 是 Java 中的一种集合类,它实现了 Set 接口,并使用哈希表(HashMap)作为其底层数据结构。哈希表是一种以键值对(key-value)形式存储数据的数据结构,它根据键的哈希值进行快速的查找、插入和删除操作

二、构造器

/**
 * 默认的无参构造器,创建一个HashMap。
 * 因此,默认加载因子0.75,默认初始容量16
 */
public HashSet() {
    map = new HashMap<>();
}

/**
 * 将参数c,也就是集合添加到HashMap中
 * 默认加载因子0.75,容量大小是取 ((c.size()/.75f) + 1) 和 16 两个的最大值
 * 也就是 c.size >= 12 时,容量为 ((c.size()/.75f) + 1)
 * c.size < 12 时,容量为 16
 */
public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

/**
 * 创建一个容量为initialCapacity和加载因子为loadFactor的HashMap
 * initialCapacity不能小于0; loadFactor不能小于等于0
 */
public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}

/**
 * 创建一个容量为initialCapacity的HashMap
 * 默认加载因子为0.75
 */
public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}

三、常用方法

/**
 * 因为,HashSet的内部是基于HashMap实现的,而HashSet的元素都是存储在Key中
 * 所以,PRESENT相当于占位符,作为HashMap每个Key的Value
 * 并且该PRESENT被static修饰,也节省了内存空间,即不需要为每个Key分配一个Value
 */
private static final Object PRESENT = new Object();

/**
 * 使用HashMap的put()方法将元素添加到内部的HashMap中
 * true,即添加成功,说明集合中没有与元素e相同的元素
 * false,即添加失败,说明集合中存在与元素e相同的元素
 */
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

/**
 * map.remove(o)也就是HashMap中的remove方法。根据Key删除键值对,并返回对应的value
 * true,删除成功,说明返回了o对应的value,也就是PRESENT
 * false,删除失败,说明返回了null,也就是比较地址失败
 */
public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}

/**
 * 调用HashMap的size()方法,返回HashMap中键值对的数量,也就是集合中元素的数量
 */
public int size() {
    return map.size();
}

/**
 * 调用HashMap的isEmpty()方法,判断HashMap中是否包含任何键值对
 * true,说明集合中不包含任何元素
 * false,说明集合中包含元素
 */
public boolean isEmpty() {
    return map.isEmpty();
}

/**
 * 调用HashMap的containsKey()方法来判断map中是否包含指定的Key,即是否包含元素o
 * true,说明存在与o相等的Key
 * false,说明没有相等的Key
 */
public boolean contains(Object o) {
    return map.containsKey(o);
}

/**
 * 调用底层HashMap的keySet()方法来获取HashMap中所有Key的集合,也就是HashSet
 * 返回一个Iterator对象,用于遍历集合中的元素
 * 使用 hasNext() 和 next() 方法按顺序遍历集合中的元素
 */
public Iterator<E> iterator() {
    return map.keySet().iterator();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值