Map底层原理
区别
基础了解 Map集合是有Key和Value的,Collection集合是只有Value。
但是 Collection集合底层也是有Key和Value,只是隐藏起来。
Map集合中的元素,key和value的数据类型可以相同,也可以不同。
Map集合中的元素,key是不允许重复的, value是可以重复的。
Map的实现类
1、HashMap
使用位桶和链表实现(最近的jdk1.8改用红黑树存储而非链表),它是线程不安全的Map,方法上都没有synchronize关键字修饰,具体可以参考 问到 1.8新特性时 这里可说 几个实现类 一般都会说这个 自己经常用的
1. hasmap 的底层数据 类型为
JDK1.7及之前:数组+链表
JDK1.8:数组+链表+红黑树
HashMap 底层存储类型的转化
数组的长度必须是2的指数次幂,为什么HashMap的加载因子要设置为0.75,为什么链表长度大于等于8时转成了红黑树
当添加元素时,会通过哈希值和数组长度计算计算下标来准确定位该元素应该put的位置 在理想的状态下面是可以 把哈希值保存到数组里面 但是正常的使用是是不可能到理想状态的 所以就了哈希冲突 这个时候链表 的作用就来了 这些冲突的 哈希就会保存到链表 里面 少量数据时 链表是可以完美解决 但是数据多了 链表长度过长时 它的查询难度是远高于数组的 就会变成树 红黑树是一棵接近于平衡的二叉树,其查询时间复杂度为O,远远比链表的查询效率高
在这之间 即使数组没有哈希冲突 也会变成树
触发条件为
数组变成 红黑二叉树. : 数组的长度达到64个
链表 变 红黑树 :链表的长度达到8个时
2、HashTable
hashTable是线程安全的一个map实现类,它实现线程安全的方法是在各个方法上添加了synchronize关键字 从这里就可以看出 必会有代替它的东西出现
3、ConcurrentHashMap
在jdk1.6/1.7中的主要实现原理是segment段锁,它不再使用和HashTable一样的synchronize一样的关键字对整个方法进行枷锁,而是转而利用segment段落锁来对其进行加锁,以保证Map的多线程安全。
简单一点就是 多个 HashTable 组成的 好处就是 不用synchronize 对整个方法加锁 使用segment 它的长度为16 ,synchronize 整比为1 表面意思 提示16倍性能
get方法,查询元素
添加一个map
put(K key, V value)
遍历
//-map取出keyset
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
Integer integer = map.get(key);
System.out.println(key+"==="+integer);
}
下面几个集合也是必懂 不晓得这些 基本就等消息了
ArrayList,LinkedList,HashSet
总结一周 让我感受最深的是经理 。每一天都有早会 大家都会说说自己的日常工作
以及遇到的问题 解决方法 总结 ,有时候我感觉别人已经讲的很完美了 , 但是他依然可以从中补充 并从中精准点明中心 使大家都听的懂 其说出来的计划安排 考虑程度
对待事物的全面性 那种人感觉说的 都是有用的 其中周五他说看完了一本书 总结出了 3个字 手 破 离
手: 可以用在新人 刚入公司时 有什么你学的 看的 一定要多动手实现 做总结文档 做什么事要有计划 计划的安排 要考虑到 如 按时完成计划 / 计划超时 /计划因为其他延误 /计划存在不可逆
破 : 体制化学习 学习优秀体制化 在延用老的 模式时 也要有自己独立创新时的模式
离 :