这几个方法都比较简单,具体功能见方法中的注释
1.forEach()
/*
* 遍历hashMap执行自定义函数action的功能
* */
@Override
public void forEach(BiConsumer<? super K, ? super V> action) {
HashMap.Node<K,V>[] tab;//定义Node类型的数组tab,存放hashMap中的元素;
if (action == null)//如果自定义函数action为空,抛出空指针异常;
throw new NullPointerException();
if (size > 0 && (tab = table) != null) {//如果hashMap不为空,把table的元素存放到tab中一份;
int mc = modCount;//定义计数变量mc=hashMap结构修改的记录次数modCount
for (int i = 0; i < tab.length; ++i) {//遍历tab中的元素
for (HashMap.Node<K,V> e = tab[i]; e != null; e = e.next)//把tab中的元素赋给e,通过e遍历自定义函数action
action.accept(e.key, e.value);
}
if (modCount != mc)//如果modCount不等于mc,说明有其它线程修改这个hashMap,抛出异常
throw new ConcurrentModificationException();
}
}
2.replaceAll()
/*
* 把hashMap中的所有value都替换为自定义函数function的执行结果
* */
@Override
public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
HashMap.Node<K,V>[] tab;//定义Node类型的数组tab,存放hashMap中的元素;
if (function == null)//如果自定义函数function为空,抛出空指针异常;
throw new NullPointerException();
if (size > 0 && (tab = table) != null) {//如果hashMap不为空,把table的元素存放到tab中一份;
int mc = modCount;//定义计数变量mc=hashMap结构修改的记录次数modCount
for (int i = 0; i < tab.length; ++i) {//遍历tab中的元素
for (HashMap.Node<K,V> e = tab[i]; e != null; e = e.next) {//把tab中的元素赋给e,通过e遍历自定义函数action
e.value = function.apply(e.key, e.value);//把hashMap中所有的value替换为function.apply()的执行结果;
}
}
if (modCount != mc)//如果modCount不等于mc,说明有其它线程修改这个hashMap,抛出异常
throw new ConcurrentModificationException();
}
}
3. clone()
/*
* 克隆hashMap
* */
@SuppressWarnings("unchecked")
@Override
public Object clone() {
HashMap<K,V> result;//定义hashMap对象result;
try {
result = (HashMap<K,V>)super.clone();//调用hashMap的父类AbstractMap的父类Object的clone(),调用clone()后,result是空的;
} catch (CloneNotSupportedException e) { //抛出异常
// this shouldn't happen, since we are Cloneable
throw new InternalError(e);
}
result.reinitialize();//初始化result对象的各种成员变量:table = null;entrySet = null;keySet = null;values = null;modCount = 0;threshold = 0;size = 0;
result.putMapEntries(this, false);//把HashMap的对象都放到result中,this代表当前调用clone()方法的hashMap对象;;
return result;//返回result,result是Object类型,通过clone()之后,result也是一个HashMap
}
4.capacity()
final float loadFactor() { return loadFactor; } //获取hashMap默认的加载因子:0,75;
/*
* 获取hashMap容量大小
*
* */
final int capacity() {
return (table != null) ? table.length : //如果hashMap的成员变量table不为空,容量就等于table的长度
(threshold > 0) ? threshold : //如果table为空,当threshold > 0,容量大小为threshold;这种情况初始化hashMap时默认带threshold;
DEFAULT_INITIAL_CAPACITY; //如果table为空,当threshold < = 0,容量大小为DEFAULT_INITIAL_CAPACITY=16;
}
本文详细解析了Java中HashMap类的四个核心方法:forEach(), replaceAll(), clone() 和 capacity()。通过对这些方法的具体实现和使用场景进行分析,帮助读者更好地理解和运用HashMap。
994

被折叠的 条评论
为什么被折叠?



