这是场景:
Set<Map.Entry<String,Integer>> st=hashMap.entrySet();
for(Map.Entry<String,Integer> me : set)
{
System.out.println(me.getKey()+":"+me.getValue());
}
现在,我的问题是设置,映射,条目所有是接口和getKey((和getValue((是输入接口中的方法。
将我的commet扩展到答案:
基本思想是公开接口隐藏实现。通常,方法返回类型是接口,并且从方法的侧面返回隐藏实现。这使该代码(LIB(的用户与实现相关。实施类可以改变而不会受到影响。
现在您对
的查询Set<String,Integer> st=hashMap.entrySet();
Hashmap源代码具有实现设置的内部类。Hashmap中存在方法entrySet((,它返回实现Set set 的该类的对象。签名中的返回类型是设置的,而不是实现类的,但它是实现返回的集合接口的混凝土类的对象。
以这种方式,hashmap.java的作者已将实现隐藏在您身上。他们可以在新版本的Java中更改实施类。只有他们需要注意他们的新实施类设置界面。
它类似于下面的代码。
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类的用户将取决于暴露的接口,并且不会知道并且不依赖隐藏的私有实现。
A a = new A();
IExposedInterfaceOfA xyz = a.similarToEntrySet();
xyz.task();
在这里,您将XYZ视为类型为I Exposedinterfaceofa,但它是指混凝土类实现的对象。
HashMap
具有所有这些接口的内部实现。
例如,有一个EntrySet
类,该类用作entrySet()
方法返回的Set
的实现:
public Set<Map.Entry<K,V>> entrySet() {
Set<Map.Entry<K,V>> es;
return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
}
,有几个类是Map.Entry
的实现。
例如:
static class Node<K,V> implements Map.Entry<K,V>
Set
和Entry
对象是在Hashmap
类内部创建的。如果您看到java.util.Hashmap
的源代码并访问entrySet()
方法,则会看到它创建一个具体的EntrySet
(该类别扩展了AbstractSet
类,又为您使用Set
接口(。您将这个对象称为Set
。同样,Hashmap
提供了Entry
类的内部实现,其中之一是Node
,您会再次找到源代码。我强烈建议您访问源代码。
正如Linus Torvalds所说,
谈话很便宜,告诉我代码
class coptosion insalitance。
entrySet
方法的定义返回一个嵌套类EntrySet
的对象。
EntrySet
是一种实现Map.Entry
接口的具体类。
Entry
也是实现Map.Entry
接口的具体类。 Entry
类定义getKey
和getValue
方法。
EntrySet
和 Entry
是在hashmap类中组成的类。因此,当您实例化HashMap
的对象时,您可以使用这些方法。
Hashmap源代码