面试宝典:数据结构-HashSet

简介: 面试宝典:数据结构-HashSet

image.png


“脱掉HashSet的外衣“


构造函数


  • 默认构造器


将传入的集合添加到HashSet的构造器


public HashSet() {
        map = new HashMap<>();
    }


  • 将传入的集合添加到HashSet的构造器


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


  • 明确初始容量和装载因子的构造器


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


  • 仅明确初始容量的构造器(装载因子默认0.75)


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


脱掉HashSet的外衣之后 发现里面是HashMap


新增元素


private static final Object PRESENT = new Object();
public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }


HashSet添加的元素是存放在HashMap的key位置上,而value取了默认常量PRESENT,是一个空对象


image.png


  • 一个HashMap中是16个默认容量元素的阵列-每个区块对应于不同的哈希码值


  • 如果各种对象具有相同的哈希码值,则它们将存储在单个存储buckets


  • 如果达到了加载因子,则会创建一个新数组,该数组的大小是前一个数组的两倍,并且所有元素都会被重新分散并在新的相应存储块中并重新分配


  • 要检索一个值,我们对一个键进行哈希处理,对其进行修改,然后转到相应的存储块,并在存在多个对象的情况下搜索潜在的链表


删除元素


removeNode


image.png


特点


  • 存储唯一元素并允许空值


  • 由HashMap支持


  • 不保持插入顺序


  • 不是线程安全的


HashSet如何保持唯一性


  • 将一个对象放入一个HashSet时,它使用该对象的hashcode值来确定一个元素是否已经在该集合中


  • 每个散列码值对应于某个块位置,该块位置可以包含计算出的散列值相同的各种元素


  • 具有相同hashCode的两个对象可能不相等。因此,将使用equals()方法比较同一存储桶中的对象


HashSet的性能


HashSet的性能主要受两个参数影响 - 初始容量和负载因子


将元素添加到集合的预期时间复杂度是O(1),在最坏的情况下(仅存在一个存储桶)

可以降至O(n) - 因此,维护正确的HashSet容量至关重要


从JDK 8开始,最坏的情况时间复杂度为O(log * n)


较低的初始容量降低了空间复杂性,但增加了重新散布的频率


根据经验:


  • 高初始容量适用于大量条目,几乎没有迭代


  • 低初始容量适用于具有大量迭代的少数条目


结语


HashSet具有恒定的时间性能和避免重复的能力 只有深入了解它,才能更好的使用它

相关文章
|
3月前
|
Java
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
1月前
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
32 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
29天前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
32 4
|
18天前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
6月前
|
存储 索引
【数据结构】HashSet的底层数据结构
【数据结构】HashSet的底层数据结构
165 2
|
5月前
|
Java Android开发 Kotlin
Android面试题:App性能优化之Java和Kotlin常见的数据结构
Java数据结构摘要:ArrayList基于数组,适合查找和修改;LinkedList适合插入删除;HashMap1.8后用数组+链表/红黑树,初始化时预估容量可避免扩容。SparseArray优化查找,ArrayMap减少冲突。 Kotlin优化摘要:Kotlin的List用`listOf/mutableListOf`,Map用`mapOf/mutableMapOf`,支持操作符重载和扩展函数。序列提供懒加载,解构用于遍历Map,扩展函数默认参数增强灵活性。
48 0
|
5月前
|
存储 算法 大数据
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
|
5月前
|
存储 算法 数据挖掘
数据结构面试常见问题:解锁10大关键问题及答案解析【图解】
数据结构面试常见问题:解锁10大关键问题及答案解析【图解】
|
5月前
|
存储 关系型数据库 MySQL
万字详细面试被吊打的总结(SE->数据结构->MYSQL)
万字详细面试被吊打的总结(SE->数据结构->MYSQL)
|
6月前
|
算法 搜索推荐 索引
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题(下)
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题
44 0