面试宝典:数据结构-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具有恒定的时间性能和避免重复的能力 只有深入了解它,才能更好的使用它

相关文章
|
1月前
|
Java
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
4月前
|
存储 索引
【数据结构】HashSet的底层数据结构
【数据结构】HashSet的底层数据结构
41 2
|
3月前
|
Java Android开发 Kotlin
Android面试题:App性能优化之Java和Kotlin常见的数据结构
Java数据结构摘要:ArrayList基于数组,适合查找和修改;LinkedList适合插入删除;HashMap1.8后用数组+链表/红黑树,初始化时预估容量可避免扩容。SparseArray优化查找,ArrayMap减少冲突。 Kotlin优化摘要:Kotlin的List用`listOf/mutableListOf`,Map用`mapOf/mutableMapOf`,支持操作符重载和扩展函数。序列提供懒加载,解构用于遍历Map,扩展函数默认参数增强灵活性。
42 0
|
3月前
|
存储 算法 大数据
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
|
3月前
|
存储 算法 数据挖掘
数据结构面试常见问题:解锁10大关键问题及答案解析【图解】
数据结构面试常见问题:解锁10大关键问题及答案解析【图解】
|
3月前
|
存储 关系型数据库 MySQL
万字详细面试被吊打的总结(SE->数据结构->MYSQL)
万字详细面试被吊打的总结(SE->数据结构->MYSQL)
|
4月前
|
算法 搜索推荐 索引
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题(下)
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题
40 0
|
4月前
|
算法 程序员 索引
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题(中)
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题
38 0
|
2天前
|
存储
|
17天前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。