问题
我试图了解Sun如何实现HashMap类的entrySet,keySet和values方法,但我遇到的代码对我来说没有意义.
我从概念上理解这些方法返回的视图直接链接到HashMap中的map.entry列表,并且它们使用自己的迭代器(引用中央HashMap迭代器)来完成大部分工作.我的问题在于理解这些视图究竟是如何被实例化的(因为它们不是副本,而是位于实际HashMap列表之上的东西).
参考
我正在查看本网站上的源代码:http://developer.classpath.org/doc/java/util/HashMap-source.html
这是给我带来麻烦的一个片段:
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行与匿名类直接相关,但我不遵循如何.
如果有人能向我解释,我将非常感激!谢谢!
在第599行,此代码实例化AbstractSet类.这怎么可能?
通过一个匿名的内部阶级.它正在创建一个具体(但未命名)的子类AbstractSet
.您可以对接口执行相同的操作.例如:
Runnable runnable = new Runnable() { @Override public void run() { // Put some code in here... } };
我假设第601,606,612,617和622行中的公共方法是匿名内部类?
不,整个班级都是匿名的内部班级.这些正在实现抽象方法AbstractSet
.
我建议你阅读匿名课程的Java教程页面.