Java HashMap中的一个奇怪内部类:KeySet,他是用来存储当前hashmap中的所有key,但大家有没有发现这个内部类比较奇怪,每当用户执行put()操作,key是怎么被加到这个set里的呢?看源代码看不出什么名堂,郁闷!
而且源代码中更奇怪的是,这个KeySet内部类有个private的构造函数,但却找不到对应的代码,怎么回事?我不着这里怎么贴图,所以大家可以打开HashMap.class可以看看。

解决方案 »

  1.   

    因为它里面并不存储key,它每次移动是访问它的外部类HashMap方法来完成的
      

  2.   

    你说的没错,但是我还是不理解其中的奥妙。
    首先,这个private构造函数哪来的?为什么我写得private inner class就没有这种构造函数?
    其次,这个KeySet的数据到底是怎么变动的?有谁能说说细节?
      

  3.   

    private class KeySet extends AbstractSet<K> {
            public Iterator<K> iterator() {
                return newKeyIterator();
            }
            public int size() {
                return size;
            }
            public boolean contains(Object o) {
                return containsKey(o);
            }
            public boolean remove(Object o) {
                return HashMap.this.removeEntryForKey(o) != null;
            }
            public void clear() {
                HashMap.this.clear();
            }
        }
    你可以看HashMap的源代码啊。构造函数你可以自己声明啊,inner class中有private的构造函数也没有问题啊
    我已经说了KeySet中根本没有数据存储,你调用它的方法时,实际上调用的是HashMap中的方法