HashMap与LinkedHashMap实现简要说明

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()方法都是浅复制,也就是只复制了对象的引用,没有作深度复制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值