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

LinkedHashMapHashMap的直接子类,二者唯一的区别是LinkedHashMapHashMap的基础上,采用双向链表(doubly-linked list)的形式将所有entry连接起来,这样是为保证元素的迭代顺序跟插入顺序相同
增加了一个头结点指向双向链表的第一个结点,遍历linkedHashmap只需要遍历这个双向链表,与哈希表大小无关(遍历不仅与插入顺序相同,而且更快)
但entry的插入删除操作需要维持这个双向链表
应用:FIFO策略的缓存,因为LinkedHashmap存在一个移除最老元素的方法,重写该方法可以在每次插入都删除最老的元素

TreeMap

实现了SortedMap接口,会根据key的大小顺序对Map中的元素进行排序。

红黑树的定义:

  1. 每个节点要么是红色,要么是黑色。
  2. 根节点必须是黑色
  3. 红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色)。
  4. 对于每个节点,从该点至叶子的任何路径,黑色节点的个数相同。

调整:变色与旋转操作

concurrentHashMap原理

JDK1.7前:分段锁机制

concurrenthashmap是保存了一个segment数组,将整个hash表划分为多个分段。

对数据的操作只需对所属的segment加锁,分段内部是线程安全的hashmap

最大并发度受segment个数限制,无法扩充

JDK1.8后:数组+链表+红黑树的底层数据结构,CAS原子操作与synchronize上锁

 

优先级队列:小根堆的实现原理(数组存储,初始化堆和堆的调整操作)

posted @   黑白灰java  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示