JDK Hashmap源代码 - 匿名内部类和抽象实例化?

 大牛 发布于 2023-02-13 16:50

问题

我试图了解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行与匿名类直接相关,但我不遵循如何.

如果有人能向我解释,我将非常感激!谢谢!

1 个回答
  • 在第599行,此代码实例化AbstractSet类.这怎么可能?

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

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

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

    不,整个班级都是匿名的内部班级.这些正在实现抽象方法AbstractSet.

    我建议你阅读匿名课程的Java教程页面.

    2023-02-13 16:53 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有