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

  • Themenstarter Themenstarter 3.Semester
  • Beginndatum Beginndatum
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:
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
 
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
 
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.
 
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);
	}
	
}
 

Zurück
Oben