问题
我试图了解Sun如何实现HashMap类的entrySet,keySet和values方法,但我遇到的代码对我来说没有意义.
我从概念上理解这些方法返回的视图直接链接到HashMap中的map.entry列表,并且它们使用自己的迭代器(引用中央HashMap迭代器)来完成大部分工作.我的问题在于理解这些视图究竟是如何被实例化的(因为它们不是副本,而是位于实际HashMap列表之上的东西).
参考
这是给我带来麻烦的一个片段:
157: private transient Set> entries;
594: public Set> entrySet()
595: {
596: if (entries == null)
597: // Create an AbstractSet with custom implementations of those methods
598: // that can be overridden easily and efficiently.
599: entries = new AbstractSet>()
600: {
601: public int size()
602: {
603: return size;
604: }
605:
606: public Iterator> iterator()
607: {
608: // Cannot create the iterator directly, because of LinkedHashMap.
609: return HashMap.this.iterator(ENTRIES);
610: }
611:
612: public void clear()
613: {
614: HashMap.this.clear();
615: }
616:
617: public boolean contains(Object o)
618: {
619: return getEntry(o) != null;
620: }
621:
622: public boolean remove(Object o)
623: {
624: HashEntry e = getEntry(o);
625: if (e != null)
626: {
627: HashMap.this.remove(e.key);
628: return true;
629: }
630: return false;
631: }
632: };
633: return entries;
634: }
问题
>在第599行,此代码实例化AbstractSet类.这怎么可能?我试图自己重新创建它,但我得到了预期的编译错误.
>我假设第601,606,612,617和622行中的公共方法是匿名内部类?我之前从未使用过这个功能所以我不知道它是如何工作的,我在网上找到的唯一例子相当简单(主要涉及Swing).我必须假设第599行与匿名类直接相关,但我不遵循如何.
如果有人能向我解释,我将非常感激!谢谢!