简体   繁体   English

java中的Map.Entry接口

[英]Map.Entry interface in java

java.util.Map.Entry as I know is a public static interface in java.util package that returns collection view of a map but as far now I am confused with the static interface and as it is Map.Entry is it an inner interface if so how do we have inner static interfaces in java 我知道java.util.Map.Entryjava.util包中的一个public static interface ,它返回一个map的集合视图但是到目前为止我对静态接口很困惑,因为它是Map.Entry它是一个内部接口如果是这样,我们如何在java中使用内部静态接口

Look people I am confused Please help me in any possible way you can. 看看我很困惑的人请以任何可能的方式帮助我。

The definition of Entry happens to live inside the definition of Map (allowed by java). Entry的定义恰好存在于Map的定义中(java允许)。 Being static means you don't need an instance of Map to refer to an Entry . static意味着您不需要Map实例来引用Entry

It's easiest to show how to use Map.Entry by an example. 通过示例演示如何使用Map.Entry是最简单的。 Here's how you can iterate over a map 以下是迭代地图的方法

Map<Integer, String> map = new HashMap<Integer, String>();

for (Map.Entry<Integer, String> 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()
}

There isn't really anything to be confused about. 没有什么可以混淆的。

Yes, Java allows interfaces to be members of classes or other interfaces. 是的,Java允许接口成为类或其他接口的成员。

No, that does not mean anything special. 不,这并不意味着什么特别的。 It changes absolutely nothing about how you can use such an interface or what you can do with it. 它完全没有改变你如何使用这样的界面或你可以用它做什么。

It only changes the name of that interface and creates a strong conceptual link between it and its enclosing type. 它只更改该接口的名称,并在它与其封闭类型之间创建一个强大的概念链接。 In this case, a Map.Entry represents an entry of a Map . 在这种情况下, Map.Entry表示Map的条目。 The designers of the API apparently felt that it made sense to stress this connection by making it a member type. API的设计者显然认为通过使其成为成员类型来强调这种联系是有意义的。

Example: 例:

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

Bar is a nested interface. Bar是一个嵌套的界面。 Nested interfaces are static by default, so you could as well write: 嵌套接口默认是静态的,所以你也可以写:

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

Now, what static in this context means is that the interface is a static member, ie a member of the class. 现在,这个上下文中的静态意味着接口是静态成员,即类的成员。

You can do this with classes as well: 您也可以使用类来完成此操作:

public class Tree {
    private static class Node {

    }
}

Here, Node is even private, meaning it's only visible within Tree. 在这里,Node甚至是私有的,这意味着它只在Tree中可见。 So, what's the benefit of this? 那么,这有什么好处呢? Why not make Node a public class? 为什么不让Node成为公共类? Because of better encapsulation. 因为更好的封装。 First, the Node is an implementation detail of the Tree, so you don't want it to be visible. 首先,Node是Tree的实现细节,因此您不希望它可见。 Second, if you expose Node via a public API, some client (programmer) could use it in his code. 其次,如果您通过公共API公开Node,某些客户端(程序员)可以在他的代码中使用它。 Now, he has a hard dependency on this class. 现在,他对这门课有很大的依赖。 If at some point you want to change the representation of you Tree, and you change/remove the Node class, the client code's may break. 如果在某些时候您想要更改Tree的表示,并且您更改/删除Node类,则客户端代码可能会中断。 And last but not least, your public API becomes smaller, which is also desirable. 最后但并非最不重要的是,您的公共API变得更小,这也是可取的。

So, when to use static member classes/interfaces? 那么,何时使用静态成员类/接口? Mostly, if you build some sort of Composite object (like a Tree, or a Linked List) or when the class only makes sense in the context of the outer class. 大多数情况下,如果您构建某种类型的Composite对象(如树或链接列表),或者该类仅在外部类的上下文中有意义。

Inner interfaces are implicitly public and static. 内部接口是隐式公共和静态的。

You can have inner interfaces as follows : 您可以使用以下内部接口:

1.   interface A {
             .....
             .....
             interface B {
                          ....
                          ....
             }

     }



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

     }

You can access the above inner interface(B) by AB where A is a class or an interface according to the above two cases. 您可以通过AB访问上述内部接口(B),其中A是根据上述两种情况的类或接口。

For example, 例如,

class x implements A.B
{
         ....
         ....
}

Yes, it's an inner interface of the Map interface. 是的,它是Map接口的内部接口。


   /**
     * A map entry (key-value pair).  The <tt>Map.entrySet</tt> method returns
     * a collection-view of the map, whose elements are of this class.  The
     * <i>only</i> way to obtain a reference to a map entry is from the
     * iterator of this collection-view.  These <tt>Map.Entry</tt> objects are
     * valid <i>only</i> 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 <tt>setValue</tt> operation on the map entry.
     *
     * @see Map#entrySet()
     * @since 1.2
     */
    interface Entry<K,V> {
        /**
     * 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
     * <tt>remove</tt> 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 <tt>remove</tt> operation).
     *
         * @param value new value to be stored in this entry
         * @return old value corresponding to the entry
         * @throws UnsupportedOperationException if the <tt>put</tt> 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 <tt>true</tt> if the given object is also a map entry and
     * the two entries represent the same mapping.  More formally, two
     * entries <tt>e1</tt> and <tt>e2</tt> represent the same mapping
     * if<pre>
         *     (e1.getKey()==null ?
         *      e2.getKey()==null : e1.getKey().equals(e2.getKey()))  &amp;&amp;
         *     (e1.getValue()==null ?
         *      e2.getValue()==null : e1.getValue().equals(e2.getValue()))
         * </pre>
     * This ensures that the <tt>equals</tt> method works properly across
     * different implementations of the <tt>Map.Entry</tt> interface.
     *
     * @param o object to be compared for equality with this map entry
     * @return <tt>true</tt> 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 <tt>e</tt> is defined to be: <pre>
     *     (e.getKey()==null   ? 0 : e.getKey().hashCode()) ^
     *     (e.getValue()==null ? 0 : e.getValue().hashCode())
         * </pre>
     * This ensures that <tt>e1.equals(e2)</tt> implies that
     * <tt>e1.hashCode()==e2.hashCode()</tt> for any two Entries
     * <tt>e1</tt> and <tt>e2</tt>, as required by the general
     * contract of <tt>Object.hashCode</tt>.
     *
     * @return the hash code value for this map entry
     * @see Object#hashCode()
     * @see Object#equals(Object)
     * @see #equals(Object)
     */
    int hashCode();
    }

For more information about interfaces, see the Interfaces tutorial and this Static Nested Interfaces article. 有关接口的更多信息,请参阅“ 接口”教程和“ 静态嵌套接口”一文。

Java allows nested interfaces . Java允许嵌套接口 You can nest them into classes or interfaces. 您可以将它们嵌套到类或接口中。 For instance, Map.Entry is a nested interface defined in the Map interface. 例如, Map.EntryMap接口中定义的嵌套接口。

Map implementations ( TreeMap , HashMap ) provide private implementations of Map.Entry , which are not visible outside the class. Map实现( TreeMapHashMap )提供了Map.Entry私有实现,这些实现在类外部是不可见的。

Bohemian's answer addresses how to use Map.Entry . Bohemian的答案解决了如何使用Map.Entry

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM