Collections containsKey() liefert false obwohl equals() true liefert

3

3.Semester

Gast
Hallo

es geht insgesamt um einen Chat.

Bei der Zuordnung der ankommenden Nachrichten zu den bestehenden Verbindungen auf Serverseite tritt das Problem auf.

[JAVA=52]

else if (pdu.getOpId() == (LWTRTPdu.OPID_DATA_REQ)
|| pdu.getOpId() == (LWTRTPdu.OPID_DATA_RSP))

{
Key key = new Key(pdu.getRemoteAddress(), pdu.getRemotePort());
log.debug("Schlüssel der in der HashMap gefunden werden muss: " + key);

Enumeration<Key> test = LWTRTServiceImpl.connectionMap.keys();

log.debug(test.nextElement().equals(key));
// liefert true

log.debug(LWTRTServiceImpl.connectionMap.containsKey(key));
// liefert false

// abprüfen, ob der Schlüsses überhaupt in der Verbindungshashmap existiert

if(LWTRTServiceImpl.connectionMap.containsKey(key)) {
log.debug("Schlüssel existiert in HashMap");
LWTRTServiceImpl.connectionMap.get(key).messageList.add(pdu);

}

[/Java]

Durch die log Ausgabe mit Verwendung von equals weiß ich, dass equals in meiner Klasse Key in Ordnung ist.
Trotzdem liefert
Code:
 LWTRTServiceImpl.connectionMap.containsKey(key))
false.

An was könnte das noch liegen?

Viele Grüße
 
Zuletzt bearbeitet von einem Moderator:

AmunRa

Gesperrter Benutzer
So wie ich das gelesen habe ist die Klasse Key von dir selbst erstellt.

Du musst daher nicht nur die equals Methode überschreiben, sondern auch die methode hashCode
 
3

3.Semester

Gast
Danke für die schnelle Antwort ich hab jetz HashCode überschrieben:

Java:
public int hashCode(){
		
		return port;
	}

Bei einem manuellen HashCode vergleich der beiden Elemente kommt true raus.

Wenn ich allerdings containsKey hernehm kommt immer noch false raus.

Attribute der Klasse Key sind:

int port
String ipAddress
 

HoaX

Top Contributor
Mach doch mal ein KSKB. Aber wenn HashCode und Equals richtig implementiert sind, dann sollte das schon funktionieren. In der Javadoc steht iirc wie diese zusammenhängen.
 
3

3.Semester

Gast
Hallo

ich hab mir jetz ein kleines kompilierbares Beispiel gebastelt in dem ich nur was in die HashMap steck und des danach versuch zu finden.
Das funktioniert gut solange ich genau das Element versuch zu bekommen das ich reingesteckt hab. Wenn ich aber ein anderes Objekt mit den exakt gleichen Werten zum Vergleich hernehme funktioniertes nicht mehr.

Mein Beispiel:

[Java]


package edu.hm.dako.lwtrt.impl;

import java.util.Enumeration;
import java.util.concurrent.ConcurrentHashMap;

public class HashTableTest {

static ConcurrentHashMap<Key, String> test = new ConcurrentHashMap<Key, String>();

static Key key1 = new Key("127.0.0.1", 243);

static Key key2 = new Key("127.0.0.1", 243);
/**
* @param args
*/
public static void main(String[] args) {

test.put(key1, "jdkajf");

Enumeration<Key> e = test.keys();

if(e.nextElement().equals(key2))
System.out.println("Equals liefert true");

e = test.keys();

if(e.nextElement().hashCode() == key2.hashCode())
System.out.println("HashCode liefert true");

if(test.containsKey(key2))
System.out.println(key2 + " ist in der HashMap ");
else
System.out.println(key2 + " ist nicht in der HashMap ");

}

}
[/code]

Meine Consolenausgabe:

Equals liefert true
HashCode liefert true
IP-Adresse: 127.0.0.1 Port: 243 ist nicht in der HashMap


Code:
 test.containsKey(key1)

liefert true.

Meine Schlussfolgerung daraus ist, dass immer noch die Speicheradressen verglichen werden.
Hab ich bei der Klasse Key ein Interface vergessen?

Die Klasse Key:

Java:
package edu.hm.dako.lwtrt.impl;

import java.io.Serializable;


public class Key implements Serializable, Comparable<Key>{

	/**
	 * 
	 */
	private static final long serialVersionUID = -8406823404608005292L;
	private String ipAdress;
	private int port;
	
	public Key (String ipAdress, int port){
		this.ipAdress = ipAdress;
		this.port = port;
		
	}

	public String getIpAdress() {
		return ipAdress;
	}

	public void setIpAdress(String ipAdress) {
		this.ipAdress = ipAdress;
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}
	
	
	public boolean equals(Key key){
		
		return (this.ipAdress.equals(key.ipAdress) && this.port == key.port);
	}
	
	public int compareTo(Key key){
		
		if(this.equals(key))
			return 0;
		else if(this.ipAdress.compareToIgnoreCase(key.getIpAdress()) != 0)
			return this.ipAdress.compareTo(key.getIpAdress());
		else if(this.port < key.port)
			return -1;
		else
			return 1;
			
		
	}
	
	public int hashCode(){
		
		return port;
	}
	
	
	public String toString(){
		
		return ("IP-Adresse: " + ipAdress + " Port: " + port);
	}
	
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Table Eintrag ,problem mit public boolean containsKey Java Basics - Anfänger-Themen 7
B Hashtable.containsKey Problem Java Basics - Anfänger-Themen 13
G Rekursive Methode liefert augenscheinlich keinen boolean-Wert zurück. Java Basics - Anfänger-Themen 4
JavaClap "Bruchrechner" liefert Fehler/keine Ausgabe bei Addition und Subtraktion Java Basics - Anfänger-Themen 0
B MySQL (jdbc) -> connection liefert NULL Java Basics - Anfänger-Themen 3
J HashSet Methode contains liefert false (hash Methode überschrieben) Java Basics - Anfänger-Themen 3
M Methoden while liefert nur den ersten Datensatz Java Basics - Anfänger-Themen 12
G Methode liefert "Min@15db9742" als Ausgabe Java Basics - Anfänger-Themen 2
Joker4632 Klassen BigDecimal Multiplikation liefert nicht erwarteten Wert Java Basics - Anfänger-Themen 6
J Kosinussatz liefert falschs Ergebnis Java Basics - Anfänger-Themen 2
J Berechnung liefert falsches Ergebnis Java Basics - Anfänger-Themen 2
E Methoden Methode liefert keinen Wert zurück Java Basics - Anfänger-Themen 16
Anfänger2011 file.isDirectory() liefert falschen Wert!? Java Basics - Anfänger-Themen 1
B Rechnung ohne Klammer liefert komisches Ergebniss Java Basics - Anfänger-Themen 3
D Operatoren IF Abfrage liefert falsches Ergebnis Java Basics - Anfänger-Themen 4
U ArrayList.get() liefert falsches Ergebnis Java Basics - Anfänger-Themen 4
L replaceAlll liefert Exception... Java Basics - Anfänger-Themen 3
M System.getProperty("java.vm.version") liefert build-Version Java Basics - Anfänger-Themen 4
R Hashset.add(Array) liefert immer true? Java Basics - Anfänger-Themen 23
F charAt-Methode liefert falsche Unicode-Werte Java Basics - Anfänger-Themen 8
P Map liefert bei put null als Ergebnis Java Basics - Anfänger-Themen 6
A contains bzw. indexOf liefert keine Treffer? Java Basics - Anfänger-Themen 3
M Problem mit getter, liefert nur alte Werte Java Basics - Anfänger-Themen 6
F arraylist.get() liefert Speicheradresse?!? Java Basics - Anfänger-Themen 2
R If-Abfrage liefert false zurück, wieso ? Java Basics - Anfänger-Themen 20
L Woerterbuch liefert immer "null" Java Basics - Anfänger-Themen 41
R warum liefert ein und dieselbe funktion nicht dasselbe return?? Java Basics - Anfänger-Themen 7
M isHidden() von java.io.File liefert immer true in Windows Java Basics - Anfänger-Themen 3
B SQL Recortset liefert nur eine Zeile Java Basics - Anfänger-Themen 4
Raidri Pattern liefert false Java Basics - Anfänger-Themen 9
J Datentypen Textfield.getText() liefert keinen String Java Basics - Anfänger-Themen 4
C warum liefert equals kein TRUE Java Basics - Anfänger-Themen 12
Y System.console() liefert immer null zurück. Java Basics - Anfänger-Themen 6
X Datentypen Vergleichsmethode liefert immer null Java Basics - Anfänger-Themen 3
J Batch Datei liefert CLASS NOT FOUND Warum !? Java Basics - Anfänger-Themen 11
O Runden - x/100 liefert long zurück Java Basics - Anfänger-Themen 7
L Enumeration paramNames liefert Werte durcheinander Java Basics - Anfänger-Themen 13
S atan liefert falsches Ergebnis Java Basics - Anfänger-Themen 6
A JavaMail liefert Datenmüll Java Basics - Anfänger-Themen 5
C HashMap liefert HashMap zurück - incompatible types Java Basics - Anfänger-Themen 2
G static array liefert falsche Werte zurück Java Basics - Anfänger-Themen 2
H GPS über ser. Schnittst. liefert teilweise Sonderzeichen Java Basics - Anfänger-Themen 3
G Parser liefert StackOverflow error Java Basics - Anfänger-Themen 6
G Einfache Berechnung liefert falsches Ergebnis Java Basics - Anfänger-Themen 2
H -Djava.library.path liefert in der Konsole "ClassNotFou Java Basics - Anfänger-Themen 4
Z DB-Abfrage liefert alte Werte Java Basics - Anfänger-Themen 11
M Mouse Listener liefert das ergebnis 2 mal! Java Basics - Anfänger-Themen 2
B equals() der Klasse Objects liefert unerwartetes Ergebnis Java Basics - Anfänger-Themen 17
P JPanel.getWidth() liefert immer 0 Java Basics - Anfänger-Themen 6
S DAY_OF_WEEK liefert immer gleichen Wert Java Basics - Anfänger-Themen 6
I String Expression mit Java validieren (true / false) Java Basics - Anfänger-Themen 34
M Was habe ich hier falsch, dass wenn ich z.B.: 11 eingebe mir false zurück gegeben wird? Java Basics - Anfänger-Themen 2
C Objekt1.equals(Objekt2) = immer false. Wieso? Java Basics - Anfänger-Themen 22
T Invertierung !(false/true) Java Basics - Anfänger-Themen 11
H Koordinateneingabe im 2D Array soll true/false zurückgeben Java Basics - Anfänger-Themen 5
M Wie gebe ich true or false aus? Java Basics - Anfänger-Themen 9
helldunkel While Schleife trotz false Java Basics - Anfänger-Themen 4
M TextArea scrollbar bei editable false Java Basics - Anfänger-Themen 5
M Erste Schritte while boolean=false läuft nur bei true??? Java Basics - Anfänger-Themen 23
J Array Muster mit true und false Java Basics - Anfänger-Themen 6
I set contains false Java Basics - Anfänger-Themen 11
N Boolean Werte - immer "false" Java Basics - Anfänger-Themen 5
O Was verursacht den Rückgabewert false bei der Methode ready() eines BufferedReaders Java Basics - Anfänger-Themen 9
B setOpaque(false) funktioniert nicht Java Basics - Anfänger-Themen 16
C ActionEvent mit CheckBox (true und false) Java Basics - Anfänger-Themen 6
M !boolean das selbe wie boolean == false? Java Basics - Anfänger-Themen 3
C Scrollpanel autoscroll(false) macht nix Java Basics - Anfänger-Themen 2
J if false Java Basics - Anfänger-Themen 3
F Enabled (false), dennoch nutzbar? Java Basics - Anfänger-Themen 3
B Warum gibst hier Equals false zurück ? Java Basics - Anfänger-Themen 23
W Methoden "Fröhliche Zahl" true | false Java Basics - Anfänger-Themen 14
D Frage zu true false in Schleifen Java Basics - Anfänger-Themen 8
feardorcha boolean array false - true - Abfrage Java Basics - Anfänger-Themen 10
Helgon Observer Pattern - hasChanged() immer false Java Basics - Anfänger-Themen 10
A .setEnabled(false) zu langsam? Java Basics - Anfänger-Themen 17
B if erzeugt nur immer ein FALSE Java Basics - Anfänger-Themen 2
I wie definiere ich ja oder nein für true or false Java Basics - Anfänger-Themen 7
Luk10 Methode gibt false zurück! Java Basics - Anfänger-Themen 2
M true und false treiben mich ins Grab! Java Basics - Anfänger-Themen 5
C setResizable(false) unter NetBeans Java Basics - Anfänger-Themen 3
F Regulärer Ausdruck warum false ? Java Basics - Anfänger-Themen 3
Y setVisible(false) Java Basics - Anfänger-Themen 21
D "true" -> Boolean wird false?! Java Basics - Anfänger-Themen 6
D Array zufällig mit 1 oder 0 oder mit true oder false füllen Java Basics - Anfänger-Themen 5
S Elemente einer Liste mit true / false Werten Java Basics - Anfänger-Themen 3
S if anweisung wird ausgeführt egal ob bedingung true o. false Java Basics - Anfänger-Themen 2
RK Scanner.hasNext() ist niemals false! o_O Java Basics - Anfänger-Themen 3
C regexp gibt immer false aus Java Basics - Anfänger-Themen 4
S jtable.editable(false) CODE? Java Basics - Anfänger-Themen 3
O true false Java Basics - Anfänger-Themen 5
G Fenster.setVisible(true); true -> false Zwischenwert? Java Basics - Anfänger-Themen 11
D Buttons gehen trotz enebled(false) Java Basics - Anfänger-Themen 8
A Übungsaufgabe lösen - Problem mit true und false Java Basics - Anfänger-Themen 6
M Textboxen lassen sich ändern obwohl editable = false Java Basics - Anfänger-Themen 8
M Per Button einer Funktion true oder false übermitteln? Java Basics - Anfänger-Themen 4
L Bedingung immer false, auch wenn zwei Strings gleich sind Java Basics - Anfänger-Themen 11
R Ist ! gleich false? Java Basics - Anfänger-Themen 3
M if(b){ b=false}else{b=true} Java Basics - Anfänger-Themen 4
K public boolean contains (Object obj) > true or false Java Basics - Anfänger-Themen 16
A Warum ist 1/10 == 0.1 false? Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben