一、Map集合:

注意:map中的链表在长度超过8之后就会转换为红黑树

①HashMap:

  1. **特点: **基于散列表的实现,查询速度快。<br /> ①-1HashMap为何查询快:<br /> Hash中用keyhash值(散列码,通过hashCode运算生成)取代了对键的缓慢搜索。每个键(键的信息)保存在数组中(同时以对键值计算生成的hash值作为数组的下表,同时在对应的数组中以链表(当链表的长度大于等于8时将其转换为树)来存储键的值。所以通过次便可以快速的查询键的值。<br /> ①-2:查询时如果hash冲突怎么办?<br /> 如果此时hash冲突,在链表数组的结构中会先找到与我们传入键的Hash值相同的Hash值,同时又以链表中key的值与我们传入的键值相比,如果相同则返回该键值。如果不同,则通过next取出下一个键值继续比较。

②linkedHashMap:

  1. **特点:** <br /> ①:在对其进行迭代时,取出的键值对的顺序是按照插入的次序
  1. public class LinkedHashMapDemo {
  2. public static void main(String[] args) {
  3. LinkedHashMap<Integer, String> lm1 = new LinkedHashMap<>();
  4. lm1.put(1,"aaa");
  5. lm1.put(3,"ccc");
  6. lm1.put(2,"bb");
  7. lm1.put(4,"ddd");
  8. System.out.println(lm1);//取出元素时以元素的插入顺序为主
  9. }
  10. }
  11. OutPut:
  12. {1=aaa, 3=ccc, 2=bb, 4=ddd}
  1. ②:内部使用链表维护,所以在迭代访问时更快。<br /> ③:linekdHashMap可以基于LRU算法(先取出没有使用过)来处理数据
  1. public class LinkedHashMapDemo {
  2. public static void main(String[] args) {
  3. //三个参数:容量、负载因子、打开LRU算法
  4. LinkedHashMap<Integer, String> lm2 = new LinkedHashMap<>(10,0.75f,true);
  5. lm2.put(1,"aaa");
  6. lm2.put(3,"ccc");
  7. lm2.put(2,"bb");
  8. lm2.put(4,"ddd");
  9. System.out.println("未使用任何元素前:"+lm2);
  10. lm2.get(1);//使用元素
  11. lm2.get(3);
  12. System.out.println("使用元素后"+lm2);
  13. }
  14. }
  15. ~OutPut:
  16. 未使用任何元素前:{1=aaa, 3=ccc, 2=bb, 4=ddd}
  17. 使用元素后{2=bb, 4=ddd, 1=aaa, 3=ccc}

③TreeMap:

  1. **特点:**<br /> ①:红黑树的结构.查看键值时会被排序(由comparatorcomparable决定)。<br /> ②:同时是唯一一个带有SubMap方法的.可以返回一个子树。<br /> ③:所得到结果都是经过排序的<br /> ** ConcurrenHashMap:**<br /> 一种线程安全的Map,不涉及同步加载

二、对map集合中使用自定义类作为键的要求:

  1. 1.必须重写equalshashCode方法<br /> 2.键被用作TreeMap时,必须要实现Comparator接口。

三.sortedMap(TreeMap是唯一的实现):使用其可以保证键处于排序状态。

方法:
image.png