TrueDei

文章目录

  • 一、前言
  • 二、效果
  • 三、如何得到
    • (一)有力的可用此方式
    • (二)无力的可用此方式
  • 四、关键代码实例
  • 五、如何使用

一、前言

在学习java源码中,全是英文,看起来就有点费劲了,所以就把这些注释翻译了一遍。

采用机器翻译,多少会有不准的地方。意思能看明白就可以了。

这是我自己学习Hashmap源码的时候做的一件事。

压缩包里存放着的和原来的是一样的:
TrueDei_第1张图片

二、效果

TrueDei_第2张图片
TrueDei_第3张图片

中英对照:

可以学英语,又可以学代码,两全其美
TrueDei_第4张图片

三、如何得到

(一)有力的可用此方式

有力的可以到这里下载:https://download.csdn.net/download/qq_17623363/12578222

(二)无力的可用此方式

无力的可以加入此微信群下载哦(完全免费提供给大家):

我已加入CSDN合伙人计划

亲爱的各位粉丝:可以添加我的CSDN官方企业微信号,和我近距离互动聊天,为您答疑解惑

直接使用微信扫码即可,不用下载企业微信

在这里插入图片描述

四、关键代码实例


/**
     * Constructs a new HashMap with the same mappings as the
     * specified Map.  The HashMap is created with
     * default load factor (0.75) and an initial capacity sufficient to
     * hold the mappings in the specified Map.
     *
     * 使用与指定Map相同的映射构造一个新的HashMap。
     * 使用默认的负载因子(0.75)和足以将映射保存在指定Map中的初始容量创建HashMap。
     *
     * @param   m the map whose mappings are to be placed in this map
     * @throws  NullPointerException if the specified map is null
     */
    public HashMap(Map<? extends K, ? extends V> m) {
        this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1,
                      DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR);
        inflateTable(threshold);

        putAllForCreate(m);
    }

    /*
    Integer.highestOneBit(15) = 8 :找到一个小于等于这个数的二的次方数
   为什么先把传入的值减一呢?
   如果传入的number是8,那么直接返回的就是8了,如果减一的话,number就等于7
   7: 0000 0111
   7 << 1 =  14 = 0001 0100  翻了一倍,这样的话,返回的结果就是翻倍后的这个数的最小的二次幂
    演算:
      0001 0100
      0001 0100 >> 1 = 0000 1010 ;

      0001 0100
  |   0000 1010
  =   0001 1110

      0001 1110 >> 2 =  0000 0111

      0001 1110
     |0000 0111
     =0001 1111

      0001 1111 >>> 1 =  0000 1111

      0001 1111
     -0000 1111
      0001 0000

      最终结果:(2)0001 0000 = (10)16

   */
    //向上舍入为2的幂
    private static int roundUpToPowerOf2(int number) {
        // assert number >= 0 : "number must be non-negative";
        return number >= MAXIMUM_CAPACITY
                ? MAXIMUM_CAPACITY
                : (number > 1) ? Integer.highestOneBit((number - 1) << 1) : 1;
    }
/**
 * Inflates the table.
 * 初始化table数组
 */
private void inflateTable(int toSize) {
    // Find a power of 2 >= toSize  找一个 2 >= toSize的2的次方数
    int capacity = roundUpToPowerOf2(toSize);

    //扩容要用到的值
    threshold = (int) Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);
    //使用计算出来的值,初始化存储数据的数组
    table = new Entry[capacity];
    initHashSeedAsNeeded(capacity);
}


    /**
     * Associates the specified value with the specified key in this map.
     * If the map previously contained a mapping for the key, the old
     * value is replaced.
     * 将指定值与该映射中的指定键相关联。
     * 如果该映射先前包含该key的映射,则将替换旧值。
     *
     * @param key key with which the specified value is to be associated
     * @param value value to be associated with the specified key
     * @return the previous value associated with key, or
     *         null if there was no mapping for key.
     *         (A null return can also indicate that the map
     *         previously associated null with key.)
     */
    public V put(K key, V value) {
        //先判断数组是不是一个空的,代表数组还未初始化;
        //类似懒加载,或者说是初始化,只有在put存元素的时候,才会真正的初始化里面的数组
        if (table == EMPTY_TABLE) {
            inflateTable(threshold);//初始化的方法
        }

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

        int hash = hash(key);//计算一个哈希值

        int i = indexFor(hash, table.length);//计算索引位置 索引始终保持在0-table.length之间

        //for():为了查找是不是重复的,如果key是重复的,就去覆盖掉旧的key的值,把原来的key的值给返回
        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++;
        //      key的hash值,key,val,索引
        addEntry(hash, key, value, i);
        return null;
    }

五、如何使用

下载下来之后,需要先解压出来:
TrueDei_第5张图片

创建一个普通的java项目,把下载的src中的文件解压到这个项目中的src包下:
TrueDei_第6张图片

如果你是idea:
TrueDei_第7张图片

选择jdk1.7版本:

TrueDei_第8张图片
只需要按下面配置即可:
TrueDei_第9张图片

这样的话,就可以随时进行编辑了,想怎么注释就可以怎么注释。

你可能感兴趣的:(死磕Java系列,HashMap源代码注释版,HashMap源代码)