实现类
HashMap LinkedHashMap TreeMap HashTable ConcurrentHashMap
HashMap
1 特点:无序 Key值唯一 Value值不唯一 Key和Value都可以为null 无下标概念 线程不安全
2 数据结构:数组+红黑树+链表
3 HashMap<K, V> put()的过程
1.i=(n-1)&hash来判断当前元素的存储下标位置,如果没有元素,直接进行存储,返回值为null
2.如果当前位置有元素,如果key相同,value不同,则直接将value进行覆盖
3.如果当前位置有元素,如果key不相同,value不同,则会出现hash冲突
way1:如果是树形节点类型,使用树形创建对象,来添加元素
way2:如果不是树形节点类型,找到p.next==null的位置,来添加元素
链表上的元素>8或者数组的长度<64,则进行扩容
链表长度>8或者数组的长度>=64,则进行转树
4 转换成红黑树的优点:
1.链表过长,会导致搜索效率降低,使用红黑树可以提高查找效率
2.红黑树是一颗自平衡的二叉查找树,树中的所有节点均自动排序,并且自平衡,可以使用二分查找,提高查找的效率
5 HashMap<K, V> 的扩容机制
1.第一次添加元素时,数组的长度扩容到16,以后都会扩容到原来的2倍,
2.链表上的元素>8或者数组的长度<64,则会扩容到原来的2倍
3.当要存放元素的数组的长度达到数组的扩容阈值,则会扩容到原来的2倍,加载因子为0.75
6 HashMap<K, V> 的遍历
keySet()获取所有的键,返回值为一个Set集合,然后通过键获取对应的值
Set<String> set = hashMap.keySet();
for (String string : set) {
System.out.printf("键-%s,值-%s", string, hashMap.get(string));
}
values()获取所有的值,返回值为一个Collection的集合
Collection<String> collection = hashMap.values();
for (String string : collection) {
System.out.println("键:" + string);
}
entrySet()获取所有的kv键值对,返回值为一个Set<Map.Entry<,>>集合
Set<Map.Entry<String, String>> set2 = hashMap.entrySet();
for (Map.Entry<String, String> entry : set2) {
System.out.printf("键-%s,值-%s"entry.getKey(),entry.getValue());
LinkedHashMap
1 特点:有序 线程不安全
TreeMap
1 特点:可以排序 通过key进行排序 线程不安全
2 数据结构:红黑树
HashTable
1 特点:无序 线程安全 Key和Value不能为null
2 数据结构:链表+数组
3线程安全的原因:通过“synchronized”同步锁实现
ConcurrentHashMap
1 特点:无序 线程安全
2 数据结构:链表+数组+红黑树
3线程安全的原因:通过“synchronized”同步锁和CAS无锁化编程模型