2016-03-24 4 views
0

Ich versuche, ein Element zu einer LinkedHashMap hinzuzufügen. Jeder Eintrag in der LHM ist ein Schlüssel und eine Klasse namens Page.Muss ich eine Instanz von Long erstellen, um ein Long als Parameter zu senden?

Ich schrieb diesen Code:

public void addPage(Page<byte[]> addPage) 
{ 
    if(numOfPages < initialCapacity) // Checks that there is room 
    { 
     pages.put(new java.lang.Long(addPage.hashCode()), addPage); 
     numOfPages++; 
    } 
} 

Es scheint, keine Fehler zu arbeiten und nicht geben.

Aber ich verstehe nicht, warum:

public void addPage(Page<byte[]> addPage) 
{ 
    if(numOfPages < initialCapacity) // Checks that there is room 
    { 
     pages.put(java.lang.Long(addPage.hashCode()), addPage); 
     numOfPages++; 
    } 
} 

funktioniert nicht. Warum muss ich eigentlich eine neue Instanz von Long erstellen, statt einfach den von hashCode zurückgegebenen int in Long zu konvertieren? Scheint sehr verschwenderisch.

Bearbeiten - die Klasse Seite:

public class Page<T> 
{ 
    private T content; 
    private java.lang.Long pageId; 

    public Page(java.lang.Long pageId, T content) 
    { 
     this.pageId = pageId; 
     this.content = content; 
    } 

    public java.lang.Long getPageId() 
    { 
     return pageId; 
    } 

    public void setPageId(java.lang.Long pageId) 
    { 
     this.pageId = pageId; 
    } 

    public T getContent() 
    { 
     return content; 
    } 

    public void setContent(T content) 
    { 
     this.content = content; 
    } 

    public boolean equals(Page<T> page) 
    { 
     if(this.pageId == page.getPageId()) 
      return true; 
     return false; 
    } 


} 
+0

'pages.put (java.lang.Long (addPage.hashCode()), addPage);' ist syntaktisch falsch. Ist das nur ein Fehler beim Kopieren und Einfügen, wenn Sie den Post hier erstellt haben oder haben Sie ihn tatsächlich mit dieser Zeile versucht? – dunni

+3

hashCode() ist normalerweise ein "int" -Wert und es ist nicht garantiert, dass es eindeutig ist, Sie erhalten Duplikate. Es ist nicht so verschwenderisch, wenn Sie den Code eines Map-Eintrags oder die Größe des von Ihnen verwendeten Werts vergleichen. Es ist unwahrscheinlich, dass es einen großen Unterschied macht. Ein weiteres Problem besteht darin, dass sich Ihr hashCode() mit hoher Wahrscheinlichkeit bei etwa 60.000 Einträgen wiederholt, lange bevor Sie sich Gedanken über verschwendeten Speicher machen müssen. –

+0

Ich sehe. Das ist in der Tat ein großes Problem. Gibt es einen besseren Weg, um dann zu hacken? –

Antwort

1

"Casting" hier wird nur die Objekterstellung von Ihnen ausblenden, so ist es ebenso effizient.

Die Art, wie ich dazu neigen würde zu schreiben wäre (long) addPage.hashCode(), die in Autoboxing kompiliert werden, die (in fast allen Fällen) ein neues Objekt sowieso zuweisen wird.

Alternativ könnten Sie Long.valueOf(addPage.hashCode()) schreiben, die das Boxing explizit macht, aber kleine hashCode Werte zwischenspeichert.

1
java.lang.Long(addPage.hashCode()) 

ist nicht gültig Syntax. Wenn der Schlüsseltyp des mapLong ist, haben Sie

pages.put((long) addPage.hashCode(), addPage); 

zu tun, weil ein int nicht implizit in einen Long umgewandelt werden.

Auch wenn es nicht wie es aussehen kann, dieser Code hat eine neue Instanz von Long erstellen, weil es implizit Boxen die long zu einem neuen Long (es sei denn, die hashCode zwischen -128 und 127 da diese Long s zwischengespeichert werden).

Scheint sehr verschwenderisch.

Ja, ist es. Dies liegt daran, dass Grundelemente zur Zeit nicht als generische Typen verwendet werden können. Ich glaube, das wird sich in Java 10 ändern.

Verwandte Themen