文章目录
- 一、前言
- 二、效果
- 三、如何得到
- (一)有力的可用此方式
- (二)无力的可用此方式
- 四、关键代码实例
- 五、如何使用
一、前言
在学习java源码中,全是英文,看起来就有点费劲了,所以就把这些注释翻译了一遍。
采用机器翻译,多少会有不准的地方。意思能看明白就可以了。
这是我自己学习Hashmap源码的时候做的一件事。
压缩包里存放着的和原来的是一样的:
二、效果
中英对照:
可以学英语,又可以学代码,两全其美
三、如何得到
(一)有力的可用此方式
有力的可以到这里下载:https://download.csdn.net/download/qq_17623363/12578222
(二)无力的可用此方式
无力的可以加入此微信群下载哦(完全免费提供给大家):
我已加入CSDN合伙人计划
亲爱的各位粉丝:可以添加我的CSDN官方企业微信号,和我近距离互动聊天,为您答疑解惑
。
直接使用微信扫码即可,不用下载企业微信
。
四、关键代码实例
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);
}
//向上舍入为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;
}
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);
}
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;
}
五、如何使用
下载下来之后,需要先解压出来:
创建一个普通的java项目,把下载的src中的文件解压到这个项目中的src包下:
如果你是idea:
选择jdk1.7版本:
只需要按下面配置即可:
这样的话,就可以随时进行编辑了,想怎么注释就可以怎么注释。