Java入门6.2---Map

 

一、Map集合

1.Map与Collection的区别

Map集合的特点:将键映射到值的对象,一个映射不能保护重复的键,每个键最多只能映射到一个值。

区别:

  1. Map集合存储元素是承兑出现的,Map的键是唯一的,值是可以重复的;
  2. Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。

要点:

  1. Map集合的数据结构针对键有效,跟值无关;
  2. Collection集合的数据结构针对元素有效。

2.Map的功能

 

二、HashMap

  1. 底层是散列表+红黑树,初始容量为16,装载因子为0.75,每次扩容2倍;
  2. 允许为null,存储无序;
  3. 非同步;
  4. 散列表容量大于64且链表大于8时,转成红黑树;
  5. key的哈希值会与该值的高16位做异或操作,进一步增加随机性;
  6. 当散列表的元素大于容量*装填因子时,会再散列,每次扩容2倍;
  7. 如果hashCode相同,key不同则替换元素,否则就是散列冲突;

三、LinkedHashMap

  1. 底层是散列表+红黑树+双向链表,父类是HashMap;
  2. 允许为null,插入有序;
  3. 非同步;
  4. 提供插入顺序和访问顺序两种,访问顺序是符合LRU算法的,一般用于扩展(默认是插入顺序);
  5. 迭代与初始容量无关(迭代的是维护的双向链表);
  6. 大多使用HashMap的API,只不过在内部重写了某些方法,维护了双向链表。

四、TreeMap

  1. 底层是红黑树,保证了时间复杂度为log(n);
  2. 可以对其进行排序,使用Comparator或者Comparable;
  3. 只要compare或者CompareTo认定该元素相等,那就相等;
  4. 非同步;
  5. 自然排序(手动排序),元素不能为null。

五、ConcurrentHashMap

  1. 底层是散列表+红黑树,支持高并发操作;
  2. key和value都不能为null;
  3. 线程是安全的,利用CAS算法和部分操作上锁实现;
  4. get方法是非阻塞,无锁的,重写node,通过volatile修饰next来实现每次获取都是最新设置的值;
  5. 在高并发环境下,统计数据(计算size等)其实是无意义的,因为在下一时刻size值就变化了。
原文地址:https://www.cnblogs.com/nxf-rabbit75/p/13225919.html