HashMap (jdk1.8) values()、entrySet()方法及Values、EntrySet内部类注释

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();
            }
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值