Ich schreibe etwas, das eine ganze Reihe von Transaktionen pro Sekunde erhalten wird. Für jede Transaktion, die hereinkommt, wird auf eine Karte Bezug genommen, deren Schlüsselwerte die ID und eine Bean sind, die bei der Verarbeitung dieser bestimmten Transaktion helfen. Im Grunde kommt jede Transaktion mit einer ID, ein Nachschlagen wird an der Karte vorgenommen, um die entsprechende Bean zur Verarbeitung abzurufen. Der klebrige Teil kommt mit der Tatsache, dass die ID für jede Transaktion nicht genau mit der ID in der Karte übereinstimmen soll. Mehr von a beginnt mit der Operation. Zu diesem Zweck habe ich statt einer Zeichenfolge als ID ein einfaches Pojo namens MyId erstellt. Codes unten:Umgang mit Karten, equals() und hashCodes(). Wie effizient ist das?
public class MyId
{
private static final int HASHCODE_CONSTANT = 1;
private String value;
public MyId(String value)
{
this.value = value;
}
@Override
public int hashCode()
{
//Returns the same hashcode value for all instances of this pojo
return HASHCODE_CONSTANT;
}
@Override
public boolean equals(Object obj)
{
//Checks for object type, forcibly casts and then compares the starts with
if(obj instanceof MyId)
{
if(!(obj == null || "".equals(obj)))
{
return this.value.startsWith(((MyId)obj).getValue());
}
}
return false;
}
public String getValue()
{
return value;
}
public void setValue(String value)
{
this.value = value;
}
//Test
public static void main(String[] args)
{
Map map = new HashMap();
map.put(new MyId("123456"), "");
System.out.println("Result: " + map.containsKey(new MyId("12345677")));
System.out.println("Result: " + map.containsKey(new MyId("11234567")));
}
}
Der erste Test gibt True zurück und der zweite Test gibt false zurück, wie es sein sollte. Es scheint, dass die Methode map.containsKey() die Hashcode-Methode Ihres Objekts aufruft und vergleicht, bevor das equals() überhaupt aufgerufen wird. Wenn Ihre Hashes nicht übereinstimmen, werden Sie nicht einmal vergleichen. Während dies funktioniert, fühlt es sich ein wenig zweifelhaft an, die Hashcode-Methode auf diese Weise zu implementieren, um die Karte auszutricksen.
Ich frage mich, ob es einen effizienteren Weg gibt, dies zu tun. Wir sind Umgang mit einer ganzen Reihe von Transaktionen/Sekunde und damit eine ganze Reihe von Nachschlagen auf der Karte.
PS: Ich habe dieses Blind codiert, also bin ich sicher, dass es Syntaxfehler gibt. Bitte ignoriere diese. Ich versuche nur, die allgemeine Idee zu vermitteln.
+1 eine viel bessere Beschreibung als ich –
Hmm ich hielt diese Alternative aber writting wurde: eine . Die Kartengröße ist bereits beträchtlich b. Die mögliche Schlüsselnummer der Kombination ist theoretisch unzählige – Michael
Sie vorberechnen und speichern Sie den Hashcode, aber Sie nie verwenden – dfa