【问题标题】:entrySet interface in java [duplicate]java中的entrySet接口[重复]
【发布时间】:2023-03-24 08:09:01
【问题描述】:
// Using entrySet() to get the entry's of the map
// m is previously created Map.

Set<Map.Entry<String,Integer>> s = m.entrySet();
for (Map.Entry<String, Integer> it: s)
{ 
    String str = it.getKey();
 }

Map.Enty 只是接口。

接口没有方法getKey();的实现

为什么上面的代码有效?就像编译器如何知道getKey() 的行为一样?

【问题讨论】:

  • 因为Node&lt;K,V&gt; in HashMap.java 实现了Map.Entry&lt;K,V&gt;,所以我不知道你在问什么。
  • 有一个正在使用的Map.Entry 的实现。如果您使用调试器单步调试代码,您可能会找出哪个类,甚至可以单步调试该类的源代码。
  • 所以你知道“接口”这个词,但显然你还没有研究它为什么存在以及如何使用它。
  • 这是多态性。 “实际类型”和“表观类型”之间存在差异。简而言之,您正在阅读的代码处理的是明显的代码。任何接口的实现者都可以以这种方式使用。
  • 为了打破你的世界,接口可以实现自 Java 8 以来的方法。

标签: java


【解决方案1】:

如下代码所示:

static class Entry<K,V> implements Map.Entry<K,V>

这段代码来自HashMap,如果我们放一个新的K-V Entry,HashMap会创建一个HashMap.Entry的新实例:

void createEntry(int hash, K key, V value, int bucketIndex) {
    Entry<K,V> e = table[bucketIndex];
    table[bucketIndex] = new Entry<>(hash, key, value, e);
    size++;
}

因此,for-each 循环中的每个 it 变量都是 HashMap.Entry class 的实例,它实现了 Map.Entry interface

【讨论】:

猜你喜欢
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
  • 2016-04-19
  • 1970-01-01
  • 2018-01-16
  • 2012-11-27
  • 1970-01-01
相关资源
最近更新 更多