Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDK Hashmap源代码-匿名内部类和抽象实例化?_Java_Hashmap_Instantiation_Anonymous Inner Class - Fatal编程技术网

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

Java JDK Hashmap源代码-匿名内部类和抽象实例化?,java,hashmap,instantiation,anonymous-inner-class,Java,Hashmap,Instantiation,Anonymous Inner Class,问题 我试图理解Sun是如何实现HashMap类的entrySet、keySet和values方法的,但是我遇到了一些对我来说毫无意义的代码 我从概念上理解,这些方法返回的视图直接链接到HashMap中的map.entry列表,并且它们在大部分工作中使用自己的迭代器(引用中心HashMap迭代器)。但我的问题是,首先要理解这些视图是如何被实例化的(因为它们不是副本,而是位于实际HashMap列表顶部的东西) 参考 我正在查看此网站上的源代码: 下面是给我带来麻烦的一个片段: 157: pr

问题

我试图理解Sun是如何实现HashMap类的entrySet、keySet和values方法的,但是我遇到了一些对我来说毫无意义的代码

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

参考

我正在查看此网站上的源代码:

下面是给我带来麻烦的一个片段:

 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:   }
157:私有瞬态集条目;
594:公共集入口集()
595:   {
596:if(条目==null)
597://使用这些方法的自定义实现创建一个抽象集
598://这可以轻松有效地覆盖。
599:entries=newAbstractSet()
600:       {
601:公共整数大小()
602:         {
603:返回大小;
604:         }
605: 
606:公共迭代器迭代器()
607:         {
608://无法直接创建迭代器,因为LinkedHashMap。
609:返回HashMap.this.iterator(条目);
610:         }
611: 
612:公共空白清除()
613:         {
614:HashMap.this.clear();
615:         }
616: 
617:公共布尔包含(对象o)
618:         {
619:返回getEntry(o)!=null;
620:         }
621: 
622:公共布尔删除(对象o)
623:         {
624:HashEntry e=getEntry(o);
625:如果(e!=null)
626:             {
627:HashMap.this.remove(e.key);
628:返回true;
629:             }
630:返回false;
631:         }
632:       };
633:返回条目;
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
的抽象方法


我建议您阅读。

Google的“Java内部类教程”,然后阅读。您混淆了方法和类。第599行实例化了匿名内部类;接下来几行中的公共方法是强制性的方法实现,非常感谢您的解释,Jon,还有链接。我完全理解它现在在做什么。它还解释了括号末尾的分号,我也漏掉了。感谢您的帮助!