2011-09-14 6 views
5

java.util.Map.Entry ne so è un pacchetto public static interface in java.util che rendimenti vista la raccolta di una mappa, ma per quanto ora mi sono confuso con l'interfaccia statica e come è Map.Entry si tratta di un interno interfaccia se sì come abbiamo interfacce statiche interne in javaMap.Entry in java

Guarda le persone che sono confuso, per favore aiutami in ogni modo possibile.

+9

StackOverflow è di circa domande ... qual è la tua domanda? –

risposta

8

La definizione di Entry si trova all'interno della definizione di Map (consentita da java). Essere static significa che non è necessaria un'istanza di Map per fare riferimento a un Entry.

È più semplice mostrare come utilizzare Map.Entry con un esempio. Ecco come si può iterazioni su una mappa

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

Non c'è davvero nulla per essere confuso circa.

Sì, Java consente interfacce per essere membri di classi o altre interfacce.

No, questo non significa niente di speciale. Non cambia assolutamente nulla su come è possibile utilizzare tale interfaccia o cosa si può fare con esso.

Cambia solo il nome dell'interfaccia e crea un forte collegamento concettuale tra esso e il suo tipo di chiusura. In questo caso, un Map.Entry rappresenta una voce di Map. I progettisti dell'API sembravano aver ritenuto opportuno sottolineare questa connessione facendone un tipo membro.

0

sì, è un'interfaccia interna dell'interfaccia 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(); 
    } 

Per ulteriori informazioni sulle interfacce, vedere il Interfaces tutorial e questo Static Nested Interfaces articolo.

2

Esempio:

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

Bar è un'interfaccia nidificato. interfacce nidificati sono statici di default, quindi si potrebbe anche scrivere:

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

Ora, che cosa statica, in questo contesto significa che l'interfaccia è un membro statico, vale a dire un membro della classe.

È possibile farlo con le classi così:

public class Tree { 
    private static class Node { 

    } 
} 

Qui, nodo è anche privata, che significa che è visibile solo all'interno dell'albero. Quindi, qual è il vantaggio di questo? Perché non rendere Node una classe pubblica? A causa di un migliore incapsulamento. Innanzitutto, il nodo è un dettaglio di implementazione dell'albero, quindi non vuoi che sia visibile. In secondo luogo, se si espone il nodo tramite un'API pubblica, alcuni client (programmatori) potrebbero usarlo nel suo codice. Ora, ha una dura dipendenza da questa classe. Se a un certo punto si desidera modificare la rappresentazione di You Tree e si modifica/rimuove la classe Node, il codice del client potrebbe interrompersi. E, ultimo ma non meno importante, la tua API pubblica diventa più piccola, che è anche auspicabile.

Quindi, quando utilizzare classi membro/interfacce statiche? Principalmente, se costruisci una sorta di oggetto composito (come un albero o un elenco collegato) o quando la classe ha senso solo nel contesto della classe esterna.

0

Java consente nested interfaces. Puoi annidarli in classi o interfacce. Ad esempio, Map.Entry è un'interfaccia nidificata definita nell'interfaccia Map.

Map implementazioni (TreeMap, HashMap) fornire implementazioni private di Map.Entry, che non sono visibili al di fuori della classe.

Bohemian's answer indirizzi come utilizzare Map.Entry.

0

Le interfacce interne sono implicitamente pubbliche e statiche.

È possibile avere interfacce interne come segue:

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

    } 



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

    } 

È possibile accedere all'interfaccia interna sopra (B) da a.b dove A è una classe o un'interfaccia secondo due casi suddetti.

Per esempio,

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