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

    xiaoxiao2025-04-01  13

    一、实例化一个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值进行

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

    转载请注明原文地址: https://ju.6miu.com/read-1297623.html
    最新回复(0)