1、HashMap实现,是基于数组存储的,初始容量为16(
static final int DEFAULT_INITIAL_CAPACITY = 16
),当数据量大到一定值时,容量会自动加大二倍(当负载因子与容量的乘积小于当前size时,开始分配)
2、从key到数据下标的映射,是通过key的hash 值与数组容器量作“&”运算得到。
3、当容量加大后,需要对原有数据进行hash重映射计算,数据会有移动。
4、当remove掉元素时,只是简单去从数组中置null,并没有作相关的容量计算,这是对效率要求,用空间换效率。
5、迭代时,生成set,keySet()方法返回,这个只是数组的一个映射,迭代的时候,还是的遍历原始数组,原则会遍历整个数组,及hash冲突的数据。
时间复杂度为O(数组长度)(在没有冲突情况 下),迭代结果顺序与数据放入时的顺序可能不相同(应该是key的字典顺序)。
6、LinkedHashMap实现,是继承HashMap而来,增加了一个双向链表(头与尾相连环形)作为数据引用存储。同时也用数组存储,因为需要计算key的hash映射来定位数据。
7、LinkedHashMap的迭代是对双向链表的遍历,效率比HashMap高,时间复杂度O(元素个数),迭代出来的数据与存储时的放入是一样的。
8、put(key,value)时,LinkedHashMap同时维护双向链表和数组。
9、LinkedHashMap containsValue()方法是在双向链表上完成的,并未遍历数组:
public boolean containsValue(Object value) {
// Overridden to take advantage of faster iterator
if (value==null) {
for (Entry e = header.after; e != header; e = e.after)
if (e.value==null)
return true;
} else {
for (Entry e = header.after; e != header; e = e.after)
if (value.equals(e.value))
return true;
}
return false;
}
10、对于Map接口的实现,jdk中clone()方法都是浅复制,也就是只复制了对象的引用,没有作深度复制。