您的位置:首页 > 理论基础 > 数据结构算法

共同学习Java源代码-数据结构-LinkedHashMap(四)

2017-12-12 16:50 447 查看
    public Set<K> keySet() {

        Set<K> ks = keySet;

        if (ks == null) {

            ks = new LinkedKeySet();

            keySet = ks;

        }

        return ks;
    }

这个是获取keySet方法 就是判断keySet属性是否为空 如果为空就创建出一个LinkedKeySet对象 LinkedKeySet对象的代码在下面

    final class LinkedKeySet extends AbstractSet<K> {

        public final int size()                 { return size; }

        public final void clear()               { LinkedHashMap.this.clear(); }

        public final Iterator<K> iterator() {

            return new LinkedKeyIterator();

        }

        public final boolean contains(Object o) { return containsKey(o); }

        public final boolean remove(Object key) {

            return removeNode(hash(key), key, null, false, true) != null;

        }

        public final Spliterator<K> spliterator()  {

            return Spliterators.spliterator(this, Spliterator.SIZED |

                                            Spliterator.ORDERED |

                                            Spliterator.DISTINCT);

        }

        public final void forEach(Consumer<? super K> action) {

            if (action == null)

                throw new NullPointerException();

            int mc = modCount;

            for (LinkedHashMap.Entry<K,V> e = head; e != null; e = e.after)

                action.accept(e.key);

            if (modCount != mc)

                throw new ConcurrentModificationException();

        }

    }

其中涉及java9新特性的两个方法就暂时不讲解 其他的与之前讲的大同小异 不多说了

    public Collection<V> values() {

        Collection<V> vs = values;

        if (vs == null) {

            vs = new LinkedValues();

            values = vs;

        }

        return vs;

    }

    final class LinkedValues extends AbstractCollection<V> {

        public final int size()                 { return size; }

        public final void clear()               { LinkedHashMap.this.clear(); }

        public final Iterator<V> iterator() {

            return new LinkedValueIterator();

        }

        public final boolean contains(Object o) { return containsValue(o); }

        public final Spliterator<V> spliterator() {

            return Spliterators.spliterator(this, Spliterator.SIZED |

                                            Spliterator.ORDERED);

        }

        public final void forEach(Consumer<? super V> action) {

            if (action == null)

                throw new NullPointerException();

            int mc = modCount;

            for (LinkedHashMap.Entry<K,V> e = head; e != null; e = e.after)

                action.accept(e.value);

            if (modCount != mc)

                throw new ConcurrentModificationException();

        }

    }

这些就是获取value集合的方法以及 LinkedValues的实现类 还是大同小异 不多说了

    public Set<Map.Entry<K,V>> entrySet() {

        Set<Map.Entry<K,V>> es;

        return (es = entrySet) == null ? (entrySet = new LinkedEntrySet()) : es;

    }

    final class LinkedEntrySet extends AbstractSet<Map.Entry<K,V>> {

        public final int size()                 { return size; }

        public final void clear()               { LinkedHashMap.this.clear(); }

        public final Iterator<Map.Entry<K,V>> iterator() {

            return new LinkedEntryIterator();

        }

        public final boolean contains(Object o) {

            if (!(o instanceof Map.Entry))

                return false;

            Map.Entry<?,?> e = (Map.Entry<?,?>) o;

            Object key = e.getKey();

            Node<K,V> candidate = getNode(hash(key), key);

            return candidate != null && candidate.equals(e);

        }

        public final boolean remove(Object o) {

            if (o instanceof Map.Entry) {

                Map.Entry<?,?> e = (Map.Entry<?,?>) o;

                Object key = e.getKey();

                Object value = e.getValue();

                return removeNode(hash(key), key, value, true, true) != null;

            }

            return false;

        }

        public final Spliterator<Map.Entry<K,V>> spliterator() {

            return Spliterators.spliterator(this, Spliterator.SIZED |

                                            Spliterator.ORDERED |

                                            Spliterator.DISTINCT);

        }

        public final void forEach(Consumer<? super Map.Entry<K,V>> action) {

            if (action == null)

                throw new NullPointerException();

            int mc = modCount;

            for (LinkedHashMap.Entry<K,V> e = head; e != null; e = e.after)

                action.accept(e);

            if (modCount != mc)

                throw new ConcurrentModificationException();

        }

    }

这个是获取LinkedEntrySet的方法以及LinkedEntrySet的实现 还是不多说了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: