一、Map集合:
注意:map中的链表在长度超过8之后就会转换为红黑树
①HashMap:
**特点: **基于散列表的实现,查询速度快。<br /> ①-1:HashMap为何查询快:<br /> Hash中用key的hash值(散列码,通过hashCode运算生成)取代了对键的缓慢搜索。每个键(键的信息)保存在数组中(同时以对键值计算生成的hash值作为数组的下表,同时在对应的数组中以链表(当链表的长度大于等于8时将其转换为树)来存储键的值。所以通过次便可以快速的查询键的值。<br /> ①-2:查询时如果hash冲突怎么办?<br /> 如果此时hash冲突,在链表数组的结构中会先找到与我们传入键的Hash值相同的Hash值,同时又以链表中key的值与我们传入的键值相比,如果相同则返回该键值。如果不同,则通过next取出下一个键值继续比较。
②linkedHashMap:
**特点:** <br /> ①:在对其进行迭代时,取出的键值对的顺序是按照插入的次序
public class LinkedHashMapDemo {
public static void main(String[] args) {
LinkedHashMap<Integer, String> lm1 = new LinkedHashMap<>();
lm1.put(1,"aaa");
lm1.put(3,"ccc");
lm1.put(2,"bb");
lm1.put(4,"ddd");
System.out.println(lm1);//取出元素时以元素的插入顺序为主
}
}
OutPut:
{1=aaa, 3=ccc, 2=bb, 4=ddd}
②:内部使用链表维护,所以在迭代访问时更快。<br /> ③:linekdHashMap可以基于LRU算法(先取出没有使用过)来处理数据
public class LinkedHashMapDemo {
public static void main(String[] args) {
//三个参数:容量、负载因子、打开LRU算法
LinkedHashMap<Integer, String> lm2 = new LinkedHashMap<>(10,0.75f,true);
lm2.put(1,"aaa");
lm2.put(3,"ccc");
lm2.put(2,"bb");
lm2.put(4,"ddd");
System.out.println("未使用任何元素前:"+lm2);
lm2.get(1);//使用元素
lm2.get(3);
System.out.println("使用元素后"+lm2);
}
}
~OutPut:
未使用任何元素前:{1=aaa, 3=ccc, 2=bb, 4=ddd}
使用元素后{2=bb, 4=ddd, 1=aaa, 3=ccc}
③TreeMap:
**特点:**<br /> ①:红黑树的结构.查看键值时会被排序(由comparator或comparable决定)。<br /> ②:同时是唯一一个带有SubMap方法的.可以返回一个子树。<br /> ③:所得到结果都是经过排序的<br /> ** ④ConcurrenHashMap:**<br /> 一种线程安全的Map,不涉及同步加载
二、对map集合中使用自定义类作为键的要求:
1.必须重写equals和hashCode方法<br /> 2.键被用作TreeMap时,必须要实现Comparator接口。
三.sortedMap(TreeMap是唯一的实现):使用其可以保证键处于排序状态。
方法: