江苏伟业建设集团网站,网站开发的发展的前景,semseo是什么意思,做网页初学者教程前言
List、Set、HashMap作为Java中常用的集合#xff0c;需要深入认识其原理和特性。
本篇博客介绍常见的关于Java中Set集合的面试问题#xff0c;结合源码分析题目背后的知识点。
关于List的博客文章如下#xff1a;
Java进阶#xff08;List#xff09;——面试时L…
前言
List、Set、HashMap作为Java中常用的集合需要深入认识其原理和特性。
本篇博客介绍常见的关于Java中Set集合的面试问题结合源码分析题目背后的知识点。
关于List的博客文章如下
Java进阶List——面试时List常见问题解读 结合源码分析
其他相关的Set的文章如下
Java学数据结构3——树Tree B树 红黑树 Java标准库中的集合Set与映射Map 使用多个映射Map的案例 目录 前言引出1. 描述一下HashSet的底层原理构造方法add方法 2. map.put方法静态常量PRESENT3. map.remove key方法PRESENT进行比较4. HashSet的去重原理5. 如何选择HashSet 或 TreeSet6. 如何得到一个线程安全的Set集合总结 引出 1.特点无序去重非线程安全 2.底层HashMap的Key值实现的 3.map.put方法静态常量PRESENT新值替换旧值 4.map.remove key方法如果KEY不存在时则返回的是null如果KEY存在时返回的就是e.value即PRESENT返回true成功返回false不成功 5.去重原理先判断hash值再通过或者equals判断整体如果返回true则为重复元素 6.无序的则采用HashSet 有序的则采用TreeSet 7.线程安全的setCollections.synchronizedSet(new HashSet());
1. 描述一下HashSet的底层原理
HashSet的特点无序去重非线程安全HashSet 底层是用HashMap的Key值实现的也有上面的3大特征
构造方法
无参和代参构造方法都会初始化这个HashMap 无参的构造方法调用了HashMap方法 有参的构造方法也是调用了HashMap方法 ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上
add方法 add方法中可以看出调用HashMap的put方法key为放入元素值为常量PRESENT 2. map.put方法静态常量PRESENT
既然hashset基于hashmap实现你说一下 hashset的add方法中为什么要在map.put的val上放上一个Object类型的静态常量PRESENT HashSet底层调用了map的put方法传入了存储的对象和PRESENT常量那我们进入put方法继续查看 put方法内调用了putVal方法PRESENT常量为形参value继续进入查看 if (e ! null) { // existing mapping for key//把旧数据存储到oldValueV oldValue e.value;//如果说存储的位置上已经有元素了if (!onlyIfAbsent || oldValue null)//新元素会替代旧元素 新KEY替代KEYe.value value;afterNodeAccess(e);//返回旧元素数据return oldValue;}modCount;if (size threshold)resize();afterNodeInsertion(evict);//如果说上面的if结构没有执行那么就说明这个位置上没有元素则新增成功返回nullreturn null;public boolean add(E e) {//上面的方法返回值决定了HashSet的add方法到底返回true还是falsereturn map.put(e, PRESENT)null;}此方法内部明确箭头标处的原理value就是PRESENT如果进入这个if结构则说明这个位置上已经存在该key则会用value替换之前的旧值然后返回旧值oldValue否则会返回null;至此我们可以看出此方法的返回值是PRESENT或者是null如果为PRESENT则说明KEY已存在则add方法就会返回false此处元素put还是成功的只是新值替换旧值返回null则add返回true此KEY不存在代表存储新的KEY-VALUE;
3. map.remove key方法PRESENT进行比较
既然hashset基于hashmap实现你说一下 hashset的remove方法中为什么要在map.remove key 完了之后要和PRESENT进行一个等值比较呢 从HashMap的remove方法中可以看出方法返回的是e.value或者null与add方法中的原理一起联想则会明白如果KEY不存在时则返回的是null如果KEY存在时返回的就是e.value即PRESENT所以在HashSet在判断此返回值PRESENT如果相等则返回true说明此KEY是存在的删除成功返回true如果返回值是null那么nullPRESENT则返回的肯定是false那么代表此KEY不存在删除自然不成功返回false public V remove(Object key) {NodeK,V e;//判断了一下如果removeNode删除得到的是null说明此KEY不存在方法返回nullreturn (e removeNode(hash(key), key, null, false, true)) null ?//否则返回e.value 就是 PRESENTnull : e.value;}public boolean remove(Object o) {//因为HashMap删除成功返回的是PRESENT PRESENT 则结果为true 代表删除成功//否则返回的是null 返回false 删除失败return map.remove(o)PRESENT;}4. HashSet的去重原理 HashMap中putVal方法中有这么一段代码判断去重原理在于hashcode的判断和equals方法的判断先判断hash值再通过或者equals判断整体如果返回true则为重复元素
5. 如何选择HashSet 或 TreeSet
无序的则采用HashSet 有序的则采用TreeSet
6. 如何得到一个线程安全的Set集合
Set datas Collections.synchronizedSet(new HashSet()); 总结
1.特点无序去重非线程安全 2.底层HashMap的Key值实现的 3.map.put方法静态常量PRESENT新值替换旧值 4.map.remove key方法如果KEY不存在时则返回的是null如果KEY存在时返回的就是e.value即PRESENT返回true成功返回false不成功 5.去重原理先判断hash值再通过或者equals判断整体如果返回true则为重复元素 6.无序的则采用HashSet 有序的则采用TreeSet 7.线程安全的setCollections.synchronizedSet(new HashSet());