Java中AbstractMap的keySet()是怎么实现的?
黄舟
黄舟 2017-04-18 09:47:34
0
2
536

Java中的AbstractMap是个抽象类,提供了一个Map接口的基础实现。

其keySet()方法是返回map中所有的key的集合。

看了其源码,一头雾水。想知道它是怎么实现的?

源码如下:

transient volatile Set<K>        keySet = null;
transient volatile Collection<V> values = null;
public Set<K> keySet() {
    if (keySet == null) {
        keySet = new AbstractSet<K>() {
            public Iterator<K> iterator() {
                return new Iterator<K>() {
                    private Iterator<Entry<K,V>> i = 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);
            }
        };
    }
    return keySet;
}
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

répondre à tous(2)
小葫芦

La mise en œuvre de

keySet n'est pas simple non plus. Jetez un oeil à cet article : http://www.cnblogs.com/dsj201...

PHPzhong
public Set<K> keySet() {
    if (keySet == null) {
        // 创建一个 Set 实例因为 AbstractSet 是一个抽象类,所以需要实现抽象方法,并且Java编译的时候会生成一个匿名类
        keySet = new AbstractSet<K>() {
            // iterator 接口在 java 中for each 会调用该方法
            public Iterator<K> iterator() {
                // 创建 Iterator 实例因为 Iterator 是一个接口同时这里也会生成一个匿名类
                return new Iterator<K>() {
                    // entrySet() 是 AbstractMap 中定义的一个抽象方法该方法由子类实现
                    // public abstract Set<Entry<K,V>> entrySet();
                    private Iterator<Entry<K,V>> i = entrySet().iterator();

                    public boolean hasNext() {
                        return i.hasNext();
                    }

                    public K next() {
                        // 返回 Map.Entry 的 key 值,因为是 keySet()
                        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);
            }
        };
    }
    return keySet;
}

entrySet().iterator() L'auteur de l'implémentation peut jeter un œil à l'implémentation dans HashMap, qui est en fait un tableau plus une liste chaînée. L'auteur devrait le comprendre s'il comprend ces deux structures de tableaux.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!