java集合学习
HashMap的原理
底层是使用拉链法解决哈希冲突的哈希表,且冲突链表长度超过8会转为红黑树提高检索效率
为什么超过8转为红黑树呢?
链表查询时间复杂度为n,红黑树查询时间复杂度为logn
红黑树的结点要维持左右子树和颜色信息,所占空间是是链表结点的两倍。将阈值设置为8体现了空间与时间的平衡思想。
两个参数:初始容量和装载系数,当hashmap的元素数量超过capacity*load factor时,会自动扩容并重新哈希(hashmap的长度一定是2的幂次方)
两个方法:自定义对象放入hashmap,需要重写hashcode和equals方法
编程题:hashmap的排序方法(按键排序与按值排序)
在多线程条件下会的重新哈希会造成元素形成循环链表,导致死循环问题。
按键排序 TreeMap(默认升序)
Map<String, String> map = new TreeMap<String, String>( new Comparator<String>() { public int compare(String obj1, String obj2) { // 降序排序 return obj2.compareTo(obj1); } });
按值排序 Collection排序
//这里将map.entrySet()转换成list List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet()); //然后通过比较器来实现排序 Collections.sort(list,new Comparator<Map.Entry<String,String>>() { //升序排序 public int compare(Entry<String, String> o1, Entry<String, String> o2) { return o1.getValue().compareTo(o2.getValue()); } });
两种迭代方法
(entrySet 进行for each遍历,此外foreach也可以迭代KeySet和values)
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue())
}
Itertor迭代(entryset().iterator())
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
hashmap和hashset转换为列表
new arraylist(set\map);
LinkedHashMap
entry
连接起来,这样是为保证元素的迭代顺序跟插入顺序相同。TreeMap
实现了SortedMap接口,会根据key的大小顺序对Map中的元素进行排序。
红黑树的定义:
- 每个节点要么是红色,要么是黑色。
- 根节点必须是黑色
- 红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色)。
- 对于每个节点,从该点至叶子的任何路径,黑色节点的个数相同。
调整:变色与旋转操作
concurrentHashMap原理
JDK1.7前:分段锁机制
concurrenthashmap是保存了一个segment数组,将整个hash表划分为多个分段。
对数据的操作只需对所属的segment加锁,分段内部是线程安全的hashmap
最大并发度受segment个数限制,无法扩充
JDK1.8后:数组+链表+红黑树的底层数据结构,CAS原子操作与synchronize上锁
优先级队列:小根堆的实现原理(数组存储,初始化堆和堆的调整操作)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示