HashSet 介绍

本文详细介绍了Java中的HashSet类,探讨了HashSet如何依赖HashMap实现存储操作。文章解释了HashSet的特点,包括允许一个null值、不保证元素顺序等,并展示了主要方法的实现原理。

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

HashSet 介绍

标签: java8源码


思路:内部就是用HashMap来存储数据.把set的值存放在map的key中.Haset 可以简单的理解为 HashMap 的key的集合. 因为其,依靠HashMap来完成各种操作.

特点

1.允许使用null,最多一个
2.不保正元素顺序
3.非同步的
4.Iterator会触发快速失败机制

签名

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

重要成员变量

 private transient HashMap<E,Object> map;
 private static final Object PRESENT = new Object();//用来放到HashMap的值中

构造方法

//空构造方法
    public HashSet() {
        map = new HashMap<>();
    }
//初始化大小的构造方法    
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }

     HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

    public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }

由此可以看出,HashSet其内部完全是依靠HashMap的来存储数据的.如下面的具体方法介绍也看的出这一点.

add(Object o);方法

  public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

由此看出,其实调用了map的put来添加元素,并且把值放在了map的key的位置

remove(Object o);方法

    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }

Iterator();方法

  public Iterator<E> iterator() {
        return map.keySet().iterator();
    }
Hashset是一种数据结构,它可以存储一组不重复的元素。它的实现方式是通过哈希表来存储元素,哈希表是一种以键值对形式存储数据的数据结构,它可以快速地查找和插入元素。 在hashset中,每个元素都被映射到哈希表中的一个位置,这个位置是通过元素的哈希值计算得到的。如果两个元素的哈希值相同,那么它们会被存储在哈希表中的同一个位置,这种情况称为哈希冲突。为了解决哈希冲突,hashset使用链表来存储在同一个位置的元素。 当需要查找一个元素时,hashset会先计算这个元素的哈希值,然后在哈希表中查找这个元素所在的位置。如果这个位置上有元素,那么hashset会遍历链表,查找是否存在与要查找的元素相同的元素。如果找到了相同的元素,那么查找成功,否则查找失败。 当需要插入一个元素时,hashset会先计算这个元素的哈希值,然后在哈希表中查找这个元素所在的位置。如果这个位置上没有元素,那么hashset会直接将这个元素插入到这个位置上。如果这个位置上已经有元素了,那么hashset会遍历链表,查找是否存在与要插入的元素相同的元素。如果找到了相同的元素,那么插入失败,否则插入成功。 总的来说,hashset是一种高效的数据结构,它可以快速地查找和插入元素。但是,由于哈希冲突的存在,它的性能可能会受到影响。因此,在设计hashset时,需要考虑如何减少哈希冲突的发生,以提高性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值