美文网首页
7.AbstractMap

7.AbstractMap

作者: 木有鱼丸啦 | 来源:发表于2019-06-26 13:33 被阅读0次

实现了Map

AbstractMap<K,V> implements Map<K,V>

1.containsValue,containsKey,get 几个方法实现基本相似

  public boolean containsValue(Object value) {
        Iterator<Entry<K,V>> i = entrySet().iterator();//获取Iterator
        if (value==null) {
            while (i.hasNext()) {//遍历取值
                Entry<K,V> e = i.next();
                if (e.getValue()==null)
                    return true;
            }
        } else {
            while (i.hasNext()) {
                Entry<K,V> e = i.next();
                if (value.equals(e.getValue()))
                    return true;
            }
        }
        return false;
    }

2.remove

 public V remove(Object key) {
        Iterator<Entry<K,V>> i = entrySet().iterator();
        Entry<K,V> correctEntry = null;
        if (key==null) {
            while (correctEntry==null && i.hasNext()) {
                Entry<K,V> e = i.next();
                if (e.getKey()==null)
                    correctEntry = e;
            }
        } else {
            while (correctEntry==null && i.hasNext()) {
                Entry<K,V> e = i.next();
                if (key.equals(e.getKey()))
                    correctEntry = e;//判断键值是否存在
            }
        }

        V oldValue = null;
        if (correctEntry !=null) {
            oldValue = correctEntry.getValue();//存在就删除,并返回值
            i.remove();
        }
        return oldValue;
    }

3.keySet(), values()

 public Set<K> keySet() {
        Set<K> ks = keySet;//获取keySet
        if (ks == null) {
            ks = new AbstractSet<K>() {//AbstractSet<E> extends AbstractCollection<E> implements Set<E>,AbstractCollection内部声明了Iterator 对象
                public Iterator<K> iterator() {
                    return new Iterator<K>() {//新建Iterator
                        private Iterator<Entry<K,V>> i = entrySet().iterator();//内部其实是entrySet().iterator();

                        public boolean hasNext() {//判断是否有下一个
                            return i.hasNext();
                        }

                        public K next() {//获取下一个值
                            return i.next().getKey();
                        }

                        public void remove() {//删除
                            i.remove();
                        }
                    };
                }

                public int size() {
                    return AbstractMap.this.size();
                }

                public boolean isEmpty() {
                    return AbstractMap.this.isEmpty();
                }

                public void clear() {
                    AbstractMap.this.clear();
                }

                public boolean contains(Object k) {
                    return AbstractMap.this.containsKey(k);
                }
            };
            keySet = ks;
        }
        return ks;
    }

4.equals(Object o)

    public boolean equals(Object o) {
        if (o == this)//地址相等返回true
            return true;

        if (!(o instanceof Map))//泛型不一致返回false
            return false;
        Map<?,?> m = (Map<?,?>) o;
        if (m.size() != size())
            return false;//大小不一致返回false

        try {
            Iterator<Entry<K,V>> i = entrySet().iterator();//逐个比较
            while (i.hasNext()) {
                Entry<K,V> e = i.next();
                K key = e.getKey();
                V value = e.getValue();
                if (value == null) {
                    if (!(m.get(key)==null && m.containsKey(key)))
                        return false;
                } else {
                    if (!value.equals(m.get(key)))
                        return false;
                }
            }
        } catch (ClassCastException unused) {
            return false;
        } catch (NullPointerException unused) {
            return false;
        }

        return true;//全部相等返回true
    }

5.hashCode()

    public int hashCode() {
        int h = 0;
        Iterator<Entry<K,V>> i = entrySet().iterator();
        while (i.hasNext())
            h += i.next().hashCode();
        return h;
    }

相关文章

  • 7.AbstractMap

    实现了Map 1.containsValue,containsKey,get 几个方法实现基本相似 2.remov...

网友评论

      本文标题:7.AbstractMap

      本文链接:https://www.haomeiwen.com/subject/imiqcctx.html