1. values()涉及到Values内部类,entrySet()涉及到EntrySet内部类。
/*
* 返回hashMap中value值组成的集合
* */
public Collection<V> values() {
Collection<V> vs = values; //定义Collection 对象vs,把hashMap父类AbstractMap的成员变量values赋值给vs
if (vs == null) {//如果vs为空,创建一个Values对象,赋值给vs
vs = new HashMap.Values();
values = vs;//把vs再赋值赋值给成员变量values
}
return vs;//返回vs
}
2. Values内部类
final class Values extends AbstractCollection<V> {
public final int size() { return size; }//返回hashMap的成员变量size的长度
public final void clear() { HashMap.this.clear(); }//调用hashMap的clear方法,this表示调用clear()方法的hashMap对象
public final Iterator<V> iterator() { return new HashMap.ValueIterator(); }//创建一个ValueIterator对象,该对象继承HashIterator,implements Iterator<K>中的next方法
public final boolean contains(Object o) { return containsValue(o); }//调用hashMap的 containsKey(o)方法
public final Spliterator<V> spliterator() {
return new HashMap.ValueSpliterator<>(HashMap.this, 0, -1, 0, 0);
}//返回一个ValueSSpliterator对象,ValueSSpliterator 继承 HashMapSpliterator<K,V>implements Spliterator<K>,调用父类的构造方法初始化对象
//ValueSSpliterator的方法中调用它的父类HashMapSpliterator中的构造方法初始化对象
public final void forEach(Consumer<? super V> action) {
Node<K,V>[] tab;//定义Node类型的数组tab
if (action == null)//如果action为空,抛出空指针异常
throw new NullPointerException();
if (size > 0 && (tab = table) != null) {//如果size大于0,把table赋值给tab,tab不为空
int mc = modCount;//定义mc变量,把modCount赋值给mc,modCount记录hashMap修改次数
for (Node<K, V> e : tab) {//遍历tab
for (; e != null; e = e.next)//循环条件e不为空,有next节点
action.accept(e.value);//调用Consumer中的accept(),value
}
if (modCount != mc) //如果modCount不等于mc,说明有其它线程修改这个hashMap,抛出异常
throw new ConcurrentModificationException();
}
}
}
3. entrySet()方法
/*
* 返回hashMap中的entrySet集合,方法和keySet Values差不多
* 具体见keySet Values的注释
* */
public Set<Map.Entry<K,V>> entrySet() {
Set<Map.Entry<K,V>> es; //定义set类型的集合es,es中存放的数据类型是Map.Entry<K,V>类型
return (es = entrySet) == null ? (entrySet = new HashMap.EntrySet()) : es;
//把hashMap的成员变量entrySet赋值给es,如果es为空,new一个EntrySet对象赋值给entrySet,否则返回es
}
4.EntrySet内部类
final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
public final int size() { return size; }//返回hashMap的成员变量size的长度
public final void clear() { HashMap.this.clear(); }//调用hashMap的clear方法,this表示调用clear()方法的hashMap对象
public final Iterator<Map.Entry<K,V>> iterator() {
return new HashMap.EntryIterator();
}//创建一个EntryIterator对象,该对象继承HashIterator,implements Iterator<K>中的next方法
/*
* 判断给定的对象是否包含在hashMap中
* */
public final boolean contains(Object o) {
if (!(o instanceof Map.Entry)) //如果传入的参数o不是一个Map.Entry的实例,则返回false
return false;
Map.Entry<?,?> e = (Map.Entry<?,?>) o;//定义Map.Entry对象e,把o强制转换成Map.Entry对象,赋值给e
Object key = e.getKey();//获取e对应的key
Node<K,V> candidate = getNode(hash(key), key); //定义node类型的节点candidate,通过(hash(key), key)去查找key节点
return candidate != null && candidate.equals(e);//candidate != null说明查到key节点,且candidate和e相等,两个条件满足,说明包含
}
/*
* 删除元素
* */
public final boolean remove(Object o) {
if (o instanceof Map.Entry) { //如果传入的参数o是一个Map.Entry的实例
Map.Entry<?,?> e = (Map.Entry<?,?>) o;//定义Map.Entry对象e,把o强制转换成Map.Entry对象,赋值给e
Object key = e.getKey();//获取e对应的key
Object value = e.getValue();//获取e对应的value
return removeNode(hash(key), key, value, true, true) != null;//调用hashMap的removeNode方法,如果removeNode执行之后的
//返回结果不为空,说明删除成功
}
return false; //默认返回false
}
public final Spliterator<Map.Entry<K,V>> spliterator() {
return new HashMap.EntrySpliterator<>(HashMap.this, 0, -1, 0, 0);
}//返回一个EntrySpliterator对象,EntrySpliterator 继承 HashMapSpliterator<K,V>implements Spliterator<K>,调用父类的构造方法初始化对象
//EntrySpliterator的方法中调用它的父类HashMapSpliterator中的构造方法初始化对象
public final void forEach(Consumer<? super Map.Entry<K,V>> action) {
Node<K,V>[] tab;//定义Node类型的数组tab
if (action == null)//如果action为空,抛出空指针异常
throw new NullPointerException();
if (size > 0 && (tab = table) != null) {//如果size大于0,把table赋值给tab,tab不为空
int mc = modCount;//定义mc变量,把modCount赋值给mc,modCount记录hashMap修改次数
for (Node<K, V> e : tab) {//遍历tab
for (; e != null; e = e.next)//循环条件e不为空,有next节点
action.accept(e);//调用Consumer中的accept(),传入参数e
}
if (modCount != mc)//如果modCount不等于mc,说明有其它线程修改这个hashMap,抛出异常
throw new ConcurrentModificationException();
}
}
}