JAVA之map
1,hashmap,hashtable,ConcurrentHashMap
考问点1,hashmap的数据结构,其数据结构为数组+链表,把key进过hash算法得到hashcode, 然后hashcode%数组大小,得到数组相应的位置然后存放,
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。不同的key进过hash和取模可能会得到相同的数组位置,这就是冲突了,一个数组位置放不下多个数据,这时候就引入了链表。
数组长度是根据链表长度而扩张,链表太长就会带来性能问题,当超过一定长度就变成红黑树,查找起来更快。
于 JDK 1.8 中引入了红黑树,底层数据结构由数组+链表
变为了数组+链表+红黑树
,不过本质并未变。
考问点2,三个map 在多线程中的表现,map的两个操作put 和 get ,先看hashtable get 和 put方法前面都加入了 synchronized
所以说hashtable是线程安全的,hashmap没有synchronized修饰所以线程不安全。
ConcurrentHashMap是使用了锁分段技术来保证线程安全的。锁分段技术:首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。
ConcurrentHashMap提供了与Hashtable和SynchronizedMap不同的锁机制。Hashtable中采用的锁机制是一次锁住整个hash表,从而在同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap中则是一次锁住一个桶。
ConcurrentHashMap默认将hash表分为16个桶,诸如get、put、remove等常用操作只锁住当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。
图片来自网络转载
