java - Map.Entry 接口(interface)如何在不创建对象的情况下调用 getValue()/getKey() 方法?

标签 java collections hashmap

场景如下:

Set<Map.Entry<String,Integer>> st=hashMap.entrySet();
for(Map.Entry<String,Integer> me : set)
{
  System.out.println(me.getKey()+":"+me.getValue());
}

现在我的问题是,如果 Set、Map、Entry 都是接口(interface),而 getKey() 和 getValue() 是 Entry 接口(interface)中的方法,Map.Entry 如何在不创建对象的情况下调用它们?

最佳答案

扩展我对答案的 promise :

基本思想是暴露接口(interface)隐藏实现。通常方法返回类型是接口(interface),并从方法的内部返回隐藏的实现。这使此类代码(库)的用户与实现脱钩。实现类可以在不影响用户的情况下改变。

现在你的问题是

Set<String,Integer> st=hashMap.entrySet();

HashMap 源代码有一个内部类实现了Set。 HashMap 中存在方法 entrySet(),它返回实现 Set 的类的对象。签名中的返回类型是 Set 而不是 那个实现类,但返回的是实现 Set 接口(interface)的具体类的对象。

HashMap.java 的作者通过这种方式向您隐藏了实现。他们可以随意更改新版本 Java 中的实现类。只有他们需要注意他们的新实现类实现了 Set 接口(interface)。

它类似于下面的代码。

public interface InterfaceExposed{
      public void task();
} 

public class A{
     private class Implementation implements InterfaceExposed{
       public void task(){
             // some code to do task as per current implementation.
       }
     }
     public IExposedInterfaceOfA similarToEntrySet(){
          return new Implementation();
    }
} 

现在类 A 的用户将依赖于暴露的接口(interface),并且不知道也不依赖于隐藏的私有(private)实现。

 A a = new A();
 IExposedInterfaceOfA xyz =    a.similarToEntrySet();
 xyz.task();

在这里您看到 xyz 是 IExposedInterfaceOfA 类型,但它指的是具体类实现的对象。

关于java - Map.Entry 接口(interface)如何在不创建对象的情况下调用 getValue()/getKey() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48971958/

相关文章:

java - 在xdocreport中设置pdf的加密密码

java - 在 repl.it 上反转 java 中的字符串

java - 在 Java 8 中合并多个 map

c# - 如何通过所有数据流 block 传播消息上限?

arrays - 如何在 Scala 数组上使用 Java Collections.shuffle()?

java - 当负载因子大于 1 时,如何填充 java 中的 hashMap?

java - 嵌套函数或方法调用会降低应用程序的性能吗

java - Jackson FAIL_ON_UNKNOWN_PROPERTIES 到 false 不工作

java - 帮助java HashMap

java - HashMap.toString() 方法的线程安全