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情况下的多线程死循环问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2023-09-27 9.27每日总结
2023-09-27 9.26每日总结
2023-09-27 《架构师之路:软件架构之美》第二章读书笔记