首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HashMap田径运动如何像entrySet

HashMap田径运动如何像entrySet
EN

Stack Overflow用户
提问于 2016-03-08 02:44:22
回答 1查看 213关注 0票数 4

当我阅读JDK的源代码时,我发现有些东西让我很困惑。这就是HashMap跟踪entrySet或值的方式。

下面是HashMap的清晰()代码

代码语言:javascript
复制
public void clear() {
    Node<K,V>[] tab;
    modCount++;
    if ((tab = table) != null && size > 0) {
        size = 0;
        for (int i = 0; i < tab.length; ++i)
            tab[i] = null;
        }
    }
}

我不知道这个方法是如何控制entrySet的。据我所知,entrySet是由HashMap实例缓存的,但我在任何地方都找不到它改变的地方。

上面的代码只是清空了表。以下是HashMap的一些字段。

代码语言:javascript
复制
public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable {
    transient Node<K, V>[] table;
    transient Set<Map.Entry<K, V>> entrySet;

    transient size;
    transient int modCount;
    int threshold;
    final float loadFactor;

    // other part
}

,我不明白。由于clear方法只更改表,它如何影响entrySet.

我使用JUnit测试我的想法。当我调用clear()方法后,HashMap的entrySet是空的。

下面是entrySet()代码

代码语言:javascript
复制
public Set<Map.Entry<K,V>> entrySet() {
    Set<Map.Entry<K,V>> es;
    return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
}

如果entrySet不是null,则返回缓存的entrySet,但clear()方法从不更改缓存的entrySet。它怎麽工作?

EN

回答 1

Stack Overflow用户

发布于 2016-03-08 03:13:24

entrySet()只是一个视图。除了(隐式)对HashMap的引用之外,它没有任何内容。它不会创建第二个数据结构,Set方法只是直接访问映射。

请参阅私有HashMap.EntrySet类的实现方式。它是一个内部类,因此它可以看到包含HashMap实例(“拥有”它的对象)。

下面是一个非常简单的例子,它的工作方式完全相同:

代码语言:javascript
复制
interface Foo {
    void setFizz(int fizz);
    int getFizz();
}

interface Bar {
    void setBazz(int bazz);
    int getBazz();

    // returns a view of this Bar as if it were a Foo
    Foo asFoo();
}

class BarImpl implements Bar {
    int bazz;

    @Override
    public int setBazz(int bazz) {
        this.bazz = bazz;
    }
    @Override
    public int getBazz() {
        return this.bazz;
    }

    @Override
    public Foo asFoo() {
        return new Foo() {
            @Override
            public int setFizz(int fizz) {
                BarImpl.this.bazz = fizz;
            }
            @Override
            public int getFizz() {
                return BarImpl.this.bazz;
            }
        };
    }
}

只有一个int,调用asFoo()只允许我们像访问Foo一样访问Bar

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35857974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档