【集合】——HashMap实现原理解析

一、实例化一个HashMap对象

	public void testHashMap() {
		Map map = new HashMap();
		map.put("hahaha", 1);
	}

二、利用put方法将保存数据

      

    public V put(K key, V value) {
        if (table == EMPTY_TABLE) {
            inflateTable(threshold);
        }
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key);
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

这个是源码中具体的put方法,接下来一点点的解析

           a.首先给分配空间,默认为10

        if (table == EMPTY_TABLE) {
            inflateTable(threshold);
        }

           b.判断key值是否为空,如果为空,返回一个空值null,因为HashMap中可以存放null值

        if (key == null)
            return putForNullKey(value);

           c.计算HashCode值

 

       //定义一个变量保存key值,因为后面要根据这个key值计算得出hashcode
        int hash = hash(key);
      //定义变量,取得table的长度,用于计算hashcode
        int i = indexFor(hash, table.length);
      //循环遍历存放key和value的Entry的泛型集合
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            //如果在entry中存在和key相同的值(通过equals方法比较key值,比较hash值,比较key值是否已经存在)
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            //如果已经存在,将用现在key所对应的value值替换之前存放的value值,HashMap是以键值对存放的,一一对应
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

             d.改变HashMap被修改的次数

             e.存放HashMap被修改的次数

             f.存放数据

            

        modCount++;
        addEntry(hash, key, value, i);
        return null;

存放数据形式:

    void createEntry(int hash, K key, V value, int bucketIndex) {
        Entry<K,V> e = table[bucketIndex];
        table[bucketIndex] = new Entry<>(hash, key, value, e);
        size++;


最终采用存放的形式还是使用数组进行存储,将索引值进行一次存储。



总结:

       HashMap是线程不安全的,采用hash算法,利用key值计算具体的hashCode值进行

存储数据。如理解有偏差,请大家及时告知。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值