4

问题

我试图了解 Sun 如何实现 HashMap 类的 entrySet、keySet 和 values 方法,但我遇到了对我来说没有意义的代码。

我从概念上理解这些方法返回的视图直接链接到 HashMap 中的 map.entry 列表,并且它们在大部分工作中使用自己的迭代器(引用中央 HashMap 迭代器)。不过,我的问题是首先要了解这些视图是如何被实例化的(因为它们不是副本,而是位于实际 HashMap 列表之上的东西)。

参考

我正在查看此站点上的源代码:http: //developer.classpath.org/doc/java/util/HashMap-source.html

这是给我带来麻烦的片段之一:

 157:   private transient Set<Map.Entry<K, V>> entries;

 594:   public Set<Map.Entry<K, V>> 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<Map.Entry<K, V>>()
 600:       {
 601:         public int size()
 602:         {
 603:           return size;
 604:         }
 605: 
 606:         public Iterator<Map.Entry<K, V>> 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<K, V> 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 行与匿名类直接相关,但我没有关注如何。

如果有人可以向我解释这一点,我将不胜感激!谢谢!

4

1 回答 1

7

在第 599 行,此代码正在实例化 AbstractSet 类。这怎么可能?

通过匿名内部类。它正在创建一个具体的(但未命名的)子类AbstractSet。您可以对接口执行相同的操作。例如:

Runnable runnable = new Runnable() {
    @Override public void run() {
        // Put some code in here...
    }
};

我假设第 601、606、612、617 和 622 行中的公共方法是匿名内部类?

不,整个类都是匿名内部类。这些是实现的抽象方法AbstractSet

我建议您阅读关于匿名类的 Java 教程页面

于 2013-11-30T22:34:00.550 回答