Интерфейс Map.Entry в Java - PullRequest
       13

Интерфейс Map.Entry в Java

5 голосов
/ 14 сентября 2011

java.util.Map.Entry, как я знаю, это пакет public static interface в java.util, который возвращает коллекционный вид карты, но до сих пор я путаюсь со статическим интерфейсом и как это Map.Entry это внутренний интерфейс, если так, как у нас есть внутренние статические интерфейсы в Java

Смотри, люди, я в замешательстве. Пожалуйста, помогите мне любым возможным способом.

Ответы [ 6 ]

8 голосов
/ 14 сентября 2011

Определение Entry происходит внутри определения Map (разрешено Java). Значение static означает, что вам не нужен экземпляр Map для ссылки на Entry.

На примере проще всего показать, как использовать Map.Entry. Вот как вы можете перебирать карту

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()
}
2 голосов
/ 14 сентября 2011

Пример:

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

Бар - это вложенный интерфейс. Вложенные интерфейсы являются статическими по умолчанию, поэтому вы также можете написать:

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

Теперь, что означает статическое в этом контексте, так это то, что интерфейс является статическим членом, то есть членом класса.

Вы можете сделать это и с классами:

public class Tree {
    private static class Node {

    }
}

Здесь, Node даже приватный, то есть он виден только внутри Tree. Итак, в чем выгода? Почему бы не сделать Node публичным классом? Из-за лучшей инкапсуляции. Во-первых, узел - это деталь реализации дерева, поэтому вы не хотите, чтобы он был видимым. Во-вторых, если вы выставите Node через публичный API, какой-то клиент (программист) может использовать его в своем коде. Теперь он сильно зависит от этого класса. Если в какой-то момент вы захотите изменить представление своего дерева, и вы измените / удалите класс Node, код клиента может сломаться. И наконец, что не менее важно, ваш публичный API становится меньше, что также желательно.

Итак, когда использовать статические члены-классы / интерфейсы? Главным образом, если вы создаете какой-то составной объект (например, дерево или связанный список) или когда класс имеет смысл только в контексте внешнего класса.

2 голосов
/ 14 сентября 2011

На самом деле нечего путать.

Да, Java позволяет интерфейсам быть членами классов или других интерфейсов.

Нет, это не значит ничего особенного. Это абсолютно ничего не меняет в том, как вы можете использовать такой интерфейс или что вы можете с ним делать.

Он только изменяет имя этого интерфейса и создает прочную концептуальную связь между ним и его типом включения. В этом случае Map.Entry представляет запись Map. По-видимому, разработчики API чувствовали, что имеет смысл подчеркнуть эту связь, сделав ее типом члена.

0 голосов
/ 20 октября 2016

Внутренние интерфейсы неявно общедоступны и статичны.

Внутренние интерфейсы могут быть следующими:

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

     }



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

     }

Вы можете получить доступ к указанному выше внутреннему интерфейсу (B)AB, где A - это класс или интерфейс в соответствии с двумя вышеупомянутыми случаями.

Например,

class x implements A.B
{
         ....
         ....
}
0 голосов
/ 14 сентября 2011

Java допускает вложенные интерфейсы .Вы можете вкладывать их в классы или интерфейсы.Например, Map.Entry - это вложенный интерфейс, определенный в интерфейсе Map.

Map реализации (TreeMap, HashMap) предоставляют частные реализации Map.Entry, которые не видны снаружикласс.

Богемский ответ описывает, как использовать Map.Entry.

0 голосов
/ 14 сентября 2011

Да, это внутренний интерфейс интерфейса Map.


<code>   /**
     * 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()))
         * 
* Это гарантирует, что метод равно работает должным образом * различные реализации интерфейса Map.Entry . * * @param o объект для сравнения на равенство с этой записью карты * @return true , если указанный объект равен этой карте * запись * / логическое значение равно (объект o); / ** * Возвращает значение хэш-кода для этой записи карты. Хеш-код * записи карты e определяется как:
     *     (e.getKey()==null   ? 0 : e.getKey().hashCode()) ^
     *     (e.getValue()==null ? 0 : e.getValue().hashCode())
         * 
* Это гарантирует, что e1.equals (e2) подразумевает, что * e1.hashCode () == e2.hashCode () для любых двух записей * e1 и e2 , в соответствии с требованиями общего * контракт Object.hashCode . * * @ вернуть значение хеш-кода для этой записи карты * @see Object # hashCode () * @see Объект # равно (Объект) * @see #equals (Объект) * / int hashCode (); }

Для получения дополнительной информации об интерфейсах см. Учебное пособие Interfaces и эту статью Статические вложенные интерфейсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...