java集合

Collection(单列集合):List 有序 可重复 :vector 数组结构  线程安全 加了锁

                     :Arraylist 数组结构  不安全 未加锁

                   :LinkedList 链表结构(双向链表) 不安全

           :Set 无序 唯一 :HashSet 哈希表结构 ——(实现类)——LinkHashSet(哈希表和链表结构)

                   :TreeSet 红黑树结构

Map(双列集合):HashTable 哈希表结构 线程安全 (官方不推荐使用)————Properties

        :HashMap 哈希表结构 不安全————LinkHashMap

        :ConcurrentHashMap 哈希表结构

        :TreeMap 红黑树结构

 

复杂度:常对幂指阶

 

ArrayList实现底层原理:1由动态的数组实现的

           2初始容量为0,第一次添加数据时初始化容量为0

           3扩容时变为原来的1.5倍,每次扩容都要拷贝数组

           4添加数据时 确保已使用长度+1后足够存下一个数据 如果大于当前数组长度,调用grow方法扩容,确保有地方存储后添加新元素,最后返回bool值成功

ArralList list = new ArrayList(10) 扩容了几次  :0,构造函数直接初始化,没有扩容

数组和List之间的转换:数组转List,使用Arrays工具类中的asList方法    修改数组内容,List受影响 因为没有创建新对象,指向同一个内存地址

            List转数组,使用List的toArray方法,需要参数List的长度  修改原List ,数组不受影响  复制内容到新的对象

ArrayList和LinkedList区别:1.底层数据结构 动态的数组  双向链表

              2.操作数据效率 A支持下标查询 L不支持     查找 AL都需要遍历,都为O(n)    新增和删除 A尾部O(1) 其他O(n)  L头尾O(1) 其他O(n) 

              3.内存占用 A连续存储占用内存小,B要存储两者指针 内存大

              4.线程安全 两者都不安全  想要安全 1.在方法内使用,局部变量则是线程安全的 2. 使用Collections.synchronizedList进行包装 

 

 

红黑树: 复杂度 查找,添加,删除 都是O(log n)

节点要么是红色,要么是黑色 

根节点是黑色

叶子节点都是黑色的空节点

红色节点的子节点都是黑色的

从任意一个节点到叶子节点的所有路径都包括相同数目的黑色节点

 

 

 

散列表(哈希表)

插入O(1)

查找删除 平均为O(1)  产生过多哈希冲突,退化为链表O(n)    链表转换为红黑树O(log n) 还可以防止DDos攻击

 

HashMap的实现原理

数据结构:底层使用数组和链表或者红黑树    put时,利用key的hashcode计算出下标

     存储时,出现hash值相同的key,key相同,覆盖原始值  不同,放入链表或则红黑树 

     获取时,通过hash找到下标进一步对比key是否相同  

HashMap的jdk1.7和jdk1.8有什么区别

1.8之前采用的时是拉链法 将数组和链表相结合,创建一个链表数组,数组中每一格是一个链表,如果遇到哈希冲突,则把冲突的值加入到链表中

1.8之后,链表长度大于阈值(默认8)并且数组长度达到64,将链表转换成红黑树。  扩容时,红黑树拆分成的树的节点小于6,退化成链表

 

 

 

 

HashMap的寻址方法

计算对象的hashCode()

进行调用hash()方法进行二次哈希,hashcode值右移16位再亦或运算,让哈希分布更加均匀

最后(数组长度-1)&hash得到索引

 

为什么HashMap的数组长度一定是2的次幂

计算索引时效率更高:可以用位与运算代替取模

扩容时重新计算索引效率更高 hash&oldCap==0,留在原来位置  否则 新位置==旧位置+oldCap

 

hashMap在1.7情况下的多线程死循环问题

 

posted @   wrf12  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2023-09-27 9.27每日总结
2023-09-27 9.26每日总结
2023-09-27 《架构师之路:软件架构之美》第二章读书笔记
点击右上角即可分享
微信分享提示