java中的Map.Entry接口

我知道java.util.Map.Entryjava.util包中的一个public static interface ,它返回一个map的集合视图但是到目前为止我对静态接口很困惑,因为它是Map.Entry它是一个内部接口如果是这样,我们如何在java中使用内部静态接口

看看我很困惑的人请以任何可能的方式帮助我。

Entry的定义恰好存在于Map的定义中(java允许)。 static意味着您不需要Map实例来引用Entry

通过示例演示如何使用Map.Entry是最简单的。 以下是迭代地图的方法

 Map map = new HashMap(); for (Map.Entry entry : map.entrySet()) { Integer key = entry.getKey(); String value = entry.getValue(); // do something with key and/or value etc // you may also alter the entry's value inside this loop via entry.setValue() } 

没有什么可以混淆的。

是的,Java允许接口成为类或其他接口的成员。

不,这并不意味着什么特别的。 它完全没有改变你如何使用这样的界面或你可以用它做什么。

它只更改该接口的名称,并在其与其封闭类型之间创建一个强大的概念链接。 在这种情况下, Map.Entry表示Map的条目。 API的设计者显然认为通过使其成为成员类型来强调这种联系是有意义的。

例:

 public class Outer { public interface Bar { Bar get(); } } 

Bar是一个嵌套的界面。 嵌套接口默认是静态的,所以你也可以写:

 public class Outer { public static interface Bar { Bar get(); } } 

现在,在此上下文中的静态意味着接口是静态成员,即类的成员。

您也可以使用类来完成此操作:

 public class Tree { private static class Node { } } 

在这里,Node甚至是私有的,这意味着它只在Tree中可见。 那么,这有什么好处呢? 为什么不让Node成为公共类? 因为更好的封装。 首先,Node是Tree的实现细节,因此您不希望它可见。 其次,如果您通过公共API公开Node,某些客户端(程序员)可以在他的代码中使用它。 现在,他对这门课有很大的依赖。 如果在某些时候您想要更改Tree的表示forms,并且您更改/删除Node类,则客户端代码可能会中断。 最后但并非最不重要的是,您的公共API变得更小,这也是可取的。

那么,何时使用静态成员类/接口? 大多数情况下,如果您构建某种Composite对象(如树或链接列表),或者该类仅在外部类的上下文中有意义。

Java允许嵌套接口 。 您可以将它们嵌套到类或接口中。 例如, Map.EntryMap接口中定义的嵌套接口。

Map实现( TreeMapHashMap )提供了Map.Entry私有实现,这些实现在类外部是不可见的。

Bohemian的答案解决了如何使用Map.Entry

是的,它是Map接口的内部接口。


  /** * A map entry (key-value pair). The Map.entrySet method returns * a collection-view of the map, whose elements are of this class. The * only way to obtain a reference to a map entry is from the * iterator of this collection-view. These Map.Entry objects are * valid only for the duration of the iteration; more formally, * the behavior of a map entry is undefined if the backing map has been * modified after the entry was returned by the iterator, except through * the setValue operation on the map entry. * * @see Map#entrySet() * @since 1.2 */ interface Entry { /** * Returns the key corresponding to this entry. * * @return the key corresponding to this entry * @throws IllegalStateException implementations may, but are not * required to, throw this exception if the entry has been * removed from the backing map. */ K getKey(); /** * Returns the value corresponding to this entry. If the mapping * has been removed from the backing map (by the iterator's * remove operation), the results of this call are undefined. * * @return the value corresponding to this entry * @throws IllegalStateException implementations may, but are not * required to, throw this exception if the entry has been * removed from the backing map. */ V getValue(); /** * Replaces the value corresponding to this entry with the specified * value (optional operation). (Writes through to the map.) The * behavior of this call is undefined if the mapping has already been * removed from the map (by the iterator's remove operation). * * @param value new value to be stored in this entry * @return old value corresponding to the entry * @throws UnsupportedOperationException if the put operation * is not supported by the backing map * @throws ClassCastException if the class of the specified value * prevents it from being stored in the backing map * @throws NullPointerException if the backing map does not permit * null values, and the specified value is null * @throws IllegalArgumentException if some property of this value * prevents it from being stored in the backing map * @throws IllegalStateException implementations may, but are not * required to, throw this exception if the entry has been * removed from the backing map. */ V setValue(V value); /** * Compares the specified object with this entry for equality. * Returns true if the given object is also a map entry and * the two entries represent the same mapping. More formally, two * entries e1 and e2 represent the same mapping * if
 * (e1.getKey()==null ? * e2.getKey()==null : e1.getKey().equals(e2.getKey())) && * (e1.getValue()==null ? * e2.getValue()==null : e1.getValue().equals(e2.getValue())) * 

* This ensures that the equals method works properly across * different implementations of the Map.Entry interface. * * @param o object to be compared for equality with this map entry * @return true if the specified object is equal to this map * entry */ boolean equals(Object o); /** * Returns the hash code value for this map entry. The hash code * of a map entry e is defined to be:

 * (e.getKey()==null ? 0 : e.getKey().hashCode()) ^ * (e.getValue()==null ? 0 : e.getValue().hashCode()) * 

* This ensures that e1.equals(e2) implies that * e1.hashCode()==e2.hashCode() for any two Entries * e1 and e2, as required by the general * contract of Object.hashCode. * * @return the hash code value for this map entry * @see Object#hashCode() * @see Object#equals(Object) * @see #equals(Object) */ int hashCode(); }


有关接口的更多信息,请参阅“ 接口”教程和“ 静态嵌套接口”一文。

内部接口是隐式公共和静态的。

您可以使用以下内部接口:

 1. interface A { ..... ..... interface B { .... .... } } 2. class A { .... .... interface B { .... .... } } 

您可以通过AB访问上述内部接口(B),其中A是根据上述两种情况的类或接口。

例如,

 class x implements AB { .... .... }