2016-05-20 4 views
2

Ich verstehe wirklich nicht aus dem folgenden Code, wie die Methoden get(), set() und toString() aufgerufen werden. Könnte mir jemand erklären?HashMap-Methoden, die nicht verstehen, wie sie heißen

Der springende Punkt hier ist nach dem Sehen der Ausgabe Ich verstehe nicht, wie die Tostring-Methode aufgerufen wurde. Ich sehe nichts explizit genannt werden.

public class MyDuplicateKeyEx { 

    public static void main(String a[]){ 

     HashMap<Price, String> hm = new HashMap<Price, String>(); 
     hm.put(new Price("Banana", 20), "Banana"); 
     hm.put(new Price("Orange", 30), "Orange"); 
     printMap(hm); 
     Price key = new Price("Banana", 20); 
     System.out.println("Adding duplicate key..."); 
     hm.put(key, "Grape"); 
     System.out.println("After adding dulicate key:"); 
     printMap(hm); 
    } 

    public static void printMap(HashMap<Price, String> map){ 

     Set<Price> keys = map.keySet(); 
     for(Price p:keys){ 
      System.out.println(p+"==>"+map.get(p)); 
     } 
    } 
} 

class Price{ 

    private String item; 
    private int price; 

    public Price(String itm, int pr){ 
     this.item = itm; 
     this.price = pr; 
    } 

    public int hashCode(){ 
     int hashcode = 0; 
     hashcode = price*20; 
     hashcode += item.hashCode(); 
     return hashcode; 
    } 

    public boolean equals(Object obj){ 
     if (obj instanceof Price) { 
      Price pp = (Price) obj; 
      return (pp.item.equals(this.item) && pp.price == this.price); 
     } else { 
      return false; 
     } 
    } 

    public String getItem() { 
     return item; 
    } 
    public void setItem(String item) { 
     this.item = item; 
    } 
    public int getPrice() { 
     return price; 
    } 
    public void setPrice(int price) { 
     this.price = price; 
    } 

    public String toString(){ 
     return "item: "+item+" price: "+price; 
    } 
} 

Ausgang:

item: Apple price: 40==>Apple 
item: Orange price: 30==>Orange 
item: Banana price: 20==>Banana 
Adding duplicate key... 
After adding dulicate key: 
item: Apple price: 40==>Apple 
item: Orange price: 30==>Orange 
item: Banana price: 20==>Grape 

Dank !!

+0

String Verkettung mit '+' macht Aufrufe an die 'toString' Methoden der verketteten Objekte. – Berger

+4

** Verwenden Sie nicht änderbare Typen als Schlüssel in 'HashMap'. –

+1

Ich denke, es ist besser, String (unveränderlich) als Schlüssel und Preis als Wert der Karte zu verwenden. –

Antwort

2

Sie haben Recht, es gibt keinen expliziten Aufruf an toString. Aber unter der Haube macht Java das. Wenn Sie p+"==>"+map.get(p) sehen, macht Java p.toString()+"==>"+map.get(p).toString(). Deshalb können Sie Strings und Objekte problemlos verketten.

Zusätzlich ist eine bessere Art und Weise durch die Schlüssel/Wert einer Karte von Iterieren ist:

public static void printMap(HashMap<Price, String> map) { 
    for (Map.Entry<Price, String> entry : map.entrySet()) { 
     System.out.println(entry.getKey() + "==>" + entry.getValue()) 
    } 
} 

Wenn eine HashMap mit benutzerdefinierten Objekten als Schlüssel verwenden, können Sie sehr müssen vorsichtig sein, dass Sie tun nie ändern Sie die Felder zur Berechnung der hashCode, wenn sie in der Karte vorhanden sind. Deshalb werden Sie oft sehen, dass endgültige Felder verwendet werden sollten, um es zu berechnen. Mit einem großen Programm werden viele unnötige Fehler vermieden.

0

Natürlich gibt es keine explizite toString! Java macht das implizit für Sie! Du solltest ihm danken, weißt du?

Die Magie liegt hinter diesem Code:

p+"==>"+map.get(p) 

Hier p ist ein Price und map.get(p) ein String ist. Also addiert das obige im Grunde einen Preis zu einer Zeichenkette und fügt dann eine weitere Zeichenkette zum Ergebnis hinzu.

Wenn Java jedes Objekt in einen String hinzufügen möchte, ruft es das Objekt des toString auf das Objekt zu Stringerste zu konvertieren. Ansonsten, wie kann ein Preis zu einer Zeichenfolge hinzugefügt werden, oder?

Tipp:

niemals Gegenstände verwendet Code, den Hash als Schlüssel einer Hash-Karte ändern. Ich habe tatsächlich eine Person gesehen, die sehr extrem war und er implementierte die hashCode Methode mit Math.random()! Hier ist der Beitrag: Could not understand the output Und gefragt, warum eine Hash-Karte Dinge mit dem gleichen Hash-Code speichern kann.

Um diese Verwirrung zu vermeiden, bitte keine veränderbaren Objekte als Schlüssel verwenden. Entfernen Sie einfach diese Setter und alles wird gut.