前言
不管怎么样,不忘学习,加油!
正文
Map接口与set和list不同他不实现Collection;map是存储键值对的一种储存结构;
HashMap
hashMap的底层是数据+链表(即哈希表、散列表),hashMap如果不指定长度就为16,默认加载因子为0.75(扩容为原来的1倍);hashMap线程是不安全的,而且hashMap的key和value值都能为null;hashMap要注意它是通过“拉链法”解决哈希冲突的。
HashTable
hashTable的底层也是数据+链表(即哈希表、散列表),hashTable的默认初始容器的11,他的加载的因子是0.75(扩容为原来的2倍加1);hashTable线程是安全的,HashTable的key和value的值都不能为空;HashTable的方法都加了同步锁的,所以他线程是安全的;因为HashTable给每个方法都加了同步锁所以他的效率很慢,而且几乎淘汰了,要用线程安全的考虑用ConcurrentHashMap;
ConcurrentHashMap
HashTable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问HashTable的线程都必须竞争同一把锁;所以在jdk1.7的时候引入了一个分段锁的概念,HashTable是对整个方法锁了,而ConcurrentHashMap通过锁分段的技术,通过增大粒子数,给每一段数据上一把锁来实现并发情况,ConcurrentHashMap是Segment数组结构(内部为数组加链表)。默认下是有16个分段锁;ConcurrentHashMap在读的时候几乎不需要加锁,在理想的情况下支持16个线程并发情况下写操作。但是注意在jdk1.8后就发生了修改,他抛弃了Segment的概念,利用CAS+synchronized来保证并发更新的安全; ConcurrentHashMap的底层是数组和可变链表(当链表数变成8换变成红黑树),
散列表结构
扩展
Vector的默认容器的10,加载因子为1,扩容增大1倍;
ArrayList的默认容器为10,扩容增大0.5倍加1;HashSet的默认容器为16,加载因子为0.75,扩容增大1倍;