java数据结构底层原理总结——HashSet

1.HashSet
HashSet 是 Java 中的一个集合类,它实现了 Set 接口,并且不允许重复的元素。HashSet 底层基于 HashMap 实现,因此它的底层原理与 HashMap 有很大的相似性。以下是 HashSet 的一些关键点和底层原理:

1. 底层数据结构

HashSet 使用 HashMap 作为底层数据结构。具体来说,HashSet 实际上持有一个 HashMap 实例,其中 HashMap 的键是集合中的元素,值是一个常量对象(通常是一个共享的静态对象)。

  • 元素存储: 在 HashSet 中,实际存储的是 HashMap 的键部分。值部分(HashMap 的值)在 HashSet 中并不使用实际的数据,而是一个固定的对象。

2. 哈希表

HashSet 使用哈希表来存储元素。这意味着 HashSet 通过哈希函数将元素映射到哈希表的一个桶(bucket)中。哈希函数根据元素的哈希码(hashCode)来确定元素应该存储在哈希表的哪个位置。

3. 哈希冲突处理

当两个元素的哈希码相同时(即发生哈希冲突),HashSet 通过链表(在 Java 8 及以后的版本中,当链表过长时会转化为红黑树)来处理冲突。具体来说:

  • 链表: 当哈希码相同的元素被添加到同一个桶中时,这些元素会以链表的形式存储在该桶中。
  • 红黑树: 如果链表长度超过一定阈值(默认为 8),则会将链表转换为红黑树,以提高查询性能。

4. 常见操作的时间复杂度

  • 添加(add): 平均时间复杂度是 O(1)。由于哈希表的操作大部分是常数时间复杂度,但在最坏情况下(例如哈希冲突过多)可能会退化到 O(n)。
  • 查找(contains): 平均时间复杂度是 O(1),与添加操作类似。
  • 删除(remove): 平均时间复杂度是 O(1),与添加操作类似。

5. 负载因子和扩容

  • 负载因子: 哈希表的负载因子决定了哈希表的填充程度。默认负载因子是 0.75,这意味着哈希表会在填充达到 75% 时进行扩容。
  • 扩容: 当哈希表的实际大小超过负载因子与当前桶数的乘积时,哈希表会进行扩容。扩容会创建一个新的、更大的哈希表,并重新计算每个元素的位置,将元素重新映射到新的表中。

示例代码

以下是一个简单的示例代码,展示了如何使用 HashSet

import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();

        // 添加元素
        set.add("apple");
        set.add("banana");
        set.add("cherry");
        set.add("apple"); // 重复元素不会被添加

        // 输出集合
        System.out.println("HashSet: " + set);

        // 查找元素
        System.out.println("Contains 'banana': " + set.contains("banana"));

        // 删除元素
        set.remove("banana");
        System.out.println("HashSet after removal: " + set);

        // 集合的大小
        System.out.println("Size of HashSet: " + set.size());
    }
}

总结

HashSet 的核心是通过哈希表来存储元素,它提供了高效的插入、删除和查找操作。由于 HashSet 是基于 HashMap 实现的,因此其内部的操作和性能特性与 HashMap 非常相似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬编程工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值