4

問題

Sun が HashMap クラスの entrySet、keySet、values メソッドをどのように実装したかを理解しようとしていますが、意味をなさないコードに出くわしています。

これらのメソッドは、HashMap 内の map.entry リストに直接リンクされたビューを返し、ほとんどの作業で (中央の HashMap イテレーターを参照する) 独自のイテレーターを使用することを概念的に理解しています。ただし、私の問題は、これらのビューが最初にどのようにインスタンス化されているかを正確に理解することです (これらはコピーではなく、実際の HashMap リストの上にあるものであるため)。

参照

このサイトにあるソース コードを見ています: http://developer.classpath.org/doc/java/util/HashMap-source.html

問題を引き起こしているスニペットの1つを次に示します。

 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