面经集合


Java集合

<p>[TOC]</p> <h1>集合概述</h1> <h1>List</h1> <h1>Set</h1> <h1>Queue</h1> <h1>Map</h1> <h2>HashMap</h2> <p>底层数据结构,重要的四个点 <a href="https://blog.csdn.net/fedorafrog/article/details/115478407">HashMap原理解析</a></p> <ul> <li><a href="https://javaguide.cn/java/collection/java-collection-questions-02.html#hashmap-的底层实现">HashMap的底层实现数据结构</a></li> <li> <p><a href="https://www.cnblogs.com/cxygg/p/16201020.html">hash碰撞的两种解决办法</a> <a href="https://blog.csdn.net/weixin_63426509/article/details/130262745">hashCode如何计算</a> <a href="https://blog.csdn.net/Xue95111/article/details/119805289">hashCode和equals</a></p> </li> <li><a href="https://blog.csdn.net/fedorafrog/article/details/115478407">HashMap初始化和桶数组的初始化</a> <a href="https://blog.csdn.net/dhj199181/article/details/106844938">HashMap桶数组长度初始化</a> <a href="https://blog.csdn.net/fedorafrog/article/details/115478407">为什么HashMap桶数组长度为2的幂次</a></li> <li> <p><a href="https://juejin.cn/post/6948993478869139486#heading-2">HashMap的put原理</a> <a href="https://blog.csdn.net/weixin_43214609/article/details/98507626">何时树化/怎么树化、为什么树化</a> <a href="https://blog.csdn.net/weixin_46984636/article/details/120606095">HashMap对null数据进行put的时候是怎么做的?</a></p> </li> <li> <p><a href="https://juejin.cn/post/6948993478869139486#heading-3">HashMap的get原理</a></p> </li> <li><a href="https://blog.csdn.net/fedorafrog/article/details/115478407">HashMap的扩容</a> <a href="https://blog.csdn.net/weixin_43214609/article/details/98507626">何时扩容、扩容多少、负载因子和容量</a> <a href="https://blog.csdn.net/cy973071263/article/details/122252652">为什么负载因子是0.75</a> <a href="https://juejin.cn/post/6844903519632228365">红黑树漫画解析</a> <a href="https://zhuanlan.zhihu.com/p/24367771">红黑树插入删除操作详解</a> <a href="https://blog.csdn.net/xiaofeng10330111/article/details/106080394">红黑树插入删除操作详解2.0</a></li> <li> <p><a href="https://blog.csdn.net/qq_37436172/article/details/128163551">1.7和1.8HashMap的区别</a> <a href="https://coolshell.cn/articles/9606.html">1.7HashMap为什么会出现死循环</a></p> </li> <li><a href="https://javaguide.cn/java/collection/java-collection-questions-02.html#hashmap-为什么线程不安全">HashMap为什么线程不安全</a> <a href="https://zhuanlan.zhihu.com/p/628754211">HashMap是否可以使用任意类型作为key?</a> <a href="https://blog.csdn.net/qq_35754976/article/details/123561963">为什么Integer、String这种包装类适合作为HashMap的key?</a> <a href="https://blog.csdn.net/qq_43342172/article/details/105272551">如果使用Object作为key,需要注意什么?</a> <a href="https://fiime.cn/blog/318587">HashMap的优缺点</a></li> </ul> <h2>LinkedHashMap</h2> <p><a href="https://blog.csdn.net/weixin_45864705/article/details/127145695">LinkedHashMap原理</a></p> <h2>ConcurrentHashMap</h2> <h2>TreeMap</h2> <h2>HashTable</h2> <p>hash,hashCode,key-value,HashTable实现原理,重要的三个点 <a href="https://blog.csdn.net/m0_63325890/article/details/130048194">HashTable原理</a></p> <ul> <li><a href="https://blog.csdn.net/zhangting19921121/article/details/104751958">HashTable重要三点</a></li> <li><a href="https://blog.csdn.net/clearLB/article/details/107903603">HashTable源码分析1.0</a> <a href="https://hestyle.blog.csdn.net/article/details/105448273">HashTable源码分析2.0</a></li> <li><a href="https://blog.csdn.net/dycyjb/article/details/121167507">HashTable线程安全</a></li> <li><a href="https://javaguide.cn/java/collection/java-collection-questions-02.html#hashmap-和-hashtable-的区别">HashTable和HashMap的区别1.0</a> <a href="https://blog.csdn.net/clearLB/article/details/107903603">HashTable和HashMap的区别2.0</a> 底层结构 初始化 插入 null 效率 安全 扩容</li> <li><a href="https://baijiahao.baidu.com/s?id=1662559559282051783">HashTable的k-v为什么不允许为null</a></li> </ul> <h1>线程安全的HashMap</h1> <p>(1)使用ConcurrentHashMap (2)使用HashTable (3)Collections.synchronizedHashMap()方法</p> <h1>ConcurrentHashMap原如何保证的线程安全</h1> <p>JDK1.7:使用分段锁,将一个Map分为了16个段,每个段都是一个小的hashmap,每次操作只对其中一个段加锁</p> <p>JDK1.8:采用CAS+Synchronized保证线程安全,每次插入数据时判断在当前数组下标是否是第一次插入,是就通过CAS方式插入,然后判断f.hash是否=-1,是的话就说明其他线程正在进行扩容,当前线程也会参与扩容;删除方法用了synchronized修饰,保证并发下移除元素安全</p> <h1>HashTable与HashMap的区别</h1> <p>(1)HashTable的每个方法都用synchronized修饰,因此是线程安全的,但同时读写效率很低 (2)HashTable的Key不允许为null (3)HashTable只对key进行一次hash,HashMap进行了两次Hash (4)HashTable底层使用的数组加链表</p> <h1>ArrayList和LinkedList的区别</h1> <p>ArratList的底层使用动态数组,默认容量为10,当元素数量到达容量时,生成一个新的数组,大小为前一次的1.5倍,然后将原来的数组copy过来;因为数组在内存中是连续的地址,所以ArrayList查找数据更快,由于扩容机制添加数据效率更低</p> <p>LinkedList的底层使用链表,在内存中是离散的,没有扩容机制;LinkedList在查找数据时需要从头遍历,所以查找慢,但是添加数据效率更高</p> <h1>如何保证ArrayList的线程安全?</h1> <p>(1)使用collentions.synchronizedList()方法为ArrayList加锁 (2)使用Vector,Vector底层与Arraylist相同,但是每个方法都由synchronized修饰,速度很慢 (3)使用juc下的CopyOnWriterArrayList,该类实现了读操作不加锁,写操作时为list创建一个副本,期间其它线程读取的都是原本list,写操作都在副本中进行,写入完成后,再将指针指向副本。</p>

页面列表

ITEM_HTML