Map类型
LinkedHashMap继承自HashMap,TreeMap继承自SortedMap, HashMap和SortedMap都实现了Map接口。Map的主要方法有remove、size、containsKey、clear、containsValue、putIfabsent
Map构造方法
不带参数的构造方法,默认长度是16,默认的负载因子是0.75。等同于
Map<Integer,String> map = new HashMap(16, 0.75f);
超过75的坐标被占用后会进行扩容。扩容之后承2变成32。如果使用了new HashMap(3)实际相当于new HashMap(8),大于这个数字的2的n次方。如果new HashMap(10000, 0.75f),插入10000条数据不一定需要扩容,因为实际容量为12288(2的14次方)
Map成员变量
每存入一个键值对,HashMap内部就增加了一个Entry。
Entry<K,V> next;
final int hash;
HashMap顺序
HashMap是无序的,遍历输出的顺序与put的顺序无关,那么是按什么顺序输出的?假设
Map<Integer,String> map = new HashMap(16);
map.put(120, "hello");
120 % 16= 8,120的key就会放在位置8,如果再put一个key为40的值,40就放在120的next属性上
如果key是string类型,需要用到的方法1:
final int hash(Object key)
用hashCode()方法将key转换成hash码后并进行优化得到的hash码,如yuwen优化后的hash码为115347492。接下来需要用到方法2:
static int indexFor(int h, int length)
对优化后的hash码进行取址,确定在HashMap中的位置,如115347492在长度为16的HashMap中坐标为4
LinkedHashMap
数据量够大的时候,LinkedHashMap在读取的时间比HashMap短,写入的时候比HashMap长
LinkedHashMap可以按写入顺序和使用顺序(需要在构造函数中增加参数)进行遍历和输出。
LRUMAP是在有限的集合里面,如果存储的时候,集合超出了限制,那么就淘汰最近最少使用的数据,实际上是一种资源调度的算法。可以通过继承改造LinkedHashMap实现LRUMAP。
TreeMap是按升序/降序排列的map