Object.equals() liefert falschen Wert?

chaostheory

Bekanntes Mitglied
Hallo,
so weit ich gelesen habe, vergleicht die Methode equals() bei Objekten, ob sie gleich sind, nicht ob sie identisch sind. Sprich der Inhalt wird verglichen, nicht der Speicherort.
Ich habe in einem Programm eine Klasse, die sieben Strings aus einer Website ausliest. In einem Test habe ich bestätigt, dass diese auch immer exakt gleich ausgelesen werden.
Wenn ich nun aber dieses Objekt in einer ArrayList speichere und in einem zweiten Aufruf den gleichen Eintrag neu auslese und mit contains() überprüfe, ob er schon in der ArrayList erhalte ich als Ergebnis false. Iteriere ich selbst über die Liste und mache bei jedem Objekt den equals-Vergleich erhalte ich bei einem true, da es ja schon gespeichert ist. Die ArrayList scheint also nicht wirklich den equals-Vergleich zu nutzen?

Grüße
 
S

Spacerat

Gast
Tja... die ArrayList... wer weiss schon, was die bei "contains()" macht, ausser "indexOf()" aufzurufen und dessen Rückgabewert mit "-1" vergleichen. "indexOf()" selber verwendet dann "equals()" nur, wenn der übergebene Parameter (das zu testende Objekt) != null ist. Wenn "contains()" also nicht korrekt funktioniert, könnte es daran liegen, dass "indexOf()" überschrieben wurde. Wenn man nun aber feststellen will, ob eine Collection mehrere Elemente einer anderen Collection enthält, verwendet man "containsAll()". "equals()" würde, wie oben bereits gesagt grösstenteils "false" ergeben (wenn size und Reihenfolge nicht stimmen).
 
Zuletzt bearbeitet von einem Moderator:
T

tröööt

Gast
@TO
das ist so nicht ganz korrekt ...

Obejct.equals(Object) ist mit "return this==obj" implementiert ... liefert als nur true wenn es ein und dasselbe objekt ist ...

es kommt immer auf die klasse an ob equals() überschrieben wird ... und wenn ja wie sinnvoll / logisch dies geschiet ...
 

chaostheory

Bekanntes Mitglied
Eine Sache, die sicher viele Missverständnisse beheben wird:
Besagt obj.equals() nun ob es ein und das selbe Objekt ist oder nur ob der Inhalt gleich ist? So wie ich das verstanden habe vergleicht equals() den Inhalt und == den Speicherort ???:L
 
T

TryToHelp

Gast
@TO
das ist so nicht ganz korrekt ...

Obejct.equals(Object) ist mit "return this==obj" implementiert ... liefert als nur true wenn es ein und dasselbe objekt ist ...

es kommt immer auf die klasse an ob equals() überschrieben wird ... und wenn ja wie sinnvoll / logisch dies geschiet ...

Es kommt auf die implementierung deiner equals methode an, das
Code:
==
liefert immer dann true wenn es das identische Objekt ist, aber das equals je nachdem was implementiert ist. bei z.B. dieser
Java:
public boolean equals(Object obj)
  {
   return true;
  }
wird immer true geliefert, und bei dieser immer false
Java:
public boolean equals(Object obj)
  {
   return false;
  }
Somit ist eine Aussage zu der Methode equals unbestimmt, beim Vergleichen ist nur sicher was
Code:
==
macht.
 
T

tröööt

Gast
wasw ich mit sagen wollte : wenn man sich nur Object.equals(Object) ansieht ... dann wäre es mit "this==object" implementiert ...
wenn man sich aber z.b. String.equals(String) ansieht wäre es so implementiert :
Java:
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
auch hier wird erstmal standardmäßig "this==obj" geprüft ... eigentlich könnte man hier auch super.equals(anObject) schreiben ... denn String erbt direkt von Object ...
dann wird geprüft ob das objekt ein string ist ...
wenn ja wird die länge verglichen ... und wenn die übereinstimmt das char-array selbst ...

ergo : String.equals(String) prüft :
1) ob es ein und dasselbe objekt ist
2) ob beide objekte vom type String sind
3) ob beide Strings die gleiche länge haben
4) ob der inhalt der char-arrays gleich ist ...


du redest hier aber von einer ArrayList
also schauen wir dort in den source und sehen : ArrayList hat selbst keine equals() methode ...
ArrayList leitet von AbstractList ab ... also schauen wir dort nach und finden das hier
Java:
public boolean equals(Object o) {
        if (o == this)
            return true;
        if (!(o instanceof List))
            return false;

        ListIterator<E> e1 = listIterator();
        ListIterator e2 = ((List) o).listIterator();
        while (e1.hasNext() && e2.hasNext()) {
            E o1 = e1.next();
            Object o2 = e2.next();
            if (!(o1==null ? o2==null : o1.equals(o2)))
                return false;
        }
        return !(e1.hasNext() || e2.hasNext());
    }
auch hier wird wieder erstmal mit "==" auf gleichheit geprüft ...
anders als bei String hat man sich hier dafür entschieden auf NOT-instanceof zu prüfen und dann mit false auszusteigen ... persönlich finde ich das hier keinen guten stil ... man hätte eher auf instanceof prüfen und dann den nachfolgenden code in den if-block packen sollen ... aber naja .. ist ne design entscheidung
dann wird mit ListIterator die List element für element durchgegangen und verglichen ...
hier sieht man auch das die elemente in der gleichen reihenfolge in der List stehen müssen ...
wenn also zwei List zwar den selben inhalt aber eine andere Reihenfolge haben sind diese laut AbstractList.equals() eben NICHT gleich ...
wenn die Iterator durch sind wird nun noch geprüft ob eine der listen noch ein zusätzliches element enthält ... also ob eine liste länger ist ... (auch hier wieder meine persönliche idee : hätte man vorher prüfen können) ... wenn das nicht der fall ist sind beide listen gleich lang und enthalten die selben elemente in der selben reihenfolge ...


da du nun auch noch von contains() spricht muss man sich dessen arbeitsweise auch genau so ansehen
ArrayList.contains(Object) sieht so aus:
Java:
public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }
also : indexOf(Object) ansehen ...
Java:
 public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }
schlussendlich wird also doch wieder String.equals() aufgerufen was ja wie oben erwähnt bei "gleichem String" auch zu true führt und somit für indexOf() ein return größer "0" damit contains() true liefert ...

ergo : laut contains wären deine strings also nicht gleich
warum jetzt allerdings beim selbst durchlaufen und prüfen true kommt ..

hmm .. sehr interessantes problem ...

hier wäre wirklich mal etwas code angebracht ...
 
S

Spacerat

Gast
Glaskugel sagt: TO übergibt eine ArrayList an "contains()" statt an "containsAll()". Auf jeden Fall übergibt er an Contains keinen String der in der ArrayList enthalten ist.
 

HazelNut

Mitglied
Ja, hey ich push hier mal, da ich einen ähnlichen Fehler habe.

Habe eine ArrayList von Squares und wenn ich bei dieser abfragen möchte ob ein element enthalten ist erhalte ich nicht immer das korekte Ergebniss. Einmal bekomme ich ein true obwohl es nicht passt und einmal vica versa.
Dabei prüfe ich genau eine Zeile vor der contains(), welche Daten darin sind und, diese sind korrekt.

Die Klasse Square überschreibt equals und hashCode.
 
S

Spacerat

Gast
Diese "hashCode" und "equals" Methoden würde ich zu gerne mal sehen. Wenn sie viel anders als folgt aussehen, wird das nie was.
Java:
class ThisClass {
  public boolean equals(Object obj) {
    if(this == obj) {
      return true;
    }
    if(obj instanceof ThisClass) {
      boolean rc = false;
      // Inhalte vergleichen.
      // auf keinen Fall "return this.hashCode() == obj.hashCode();"!
      return rc;
    }
    return false;
  }

  public int hashCode() {
    int rc = 0;
    // hashCode mit den in equals verwendeten Inhalten
    // berechnen.
    // Vorsicht bei "toString().hashCode();". Dazu muss "toString();"
    // ebenfalls überschrieben werden, möglichst mit den in "equals()"
    // verwendeten Inhalten.
    return rc;
  }
}
 

HazelNut

Mitglied
Hmm nö habs so gemacht:

Java:
@Override
public boolean equals(Object obj) {
	boolean value = false;
	if (obj instanceof Square) {
		value = (this.getRow() == ((Square) obj).getRow());
		value = (this.getCol() == (((Square) obj).getCol()));
		return value;
	}
	return value;
}
	
@Override
public int hashCode() {
	return (row * col + row );
}

equals müsste passen und hashCode ... naja unwahrscheinlich, dass es für zwei Objekte mit unterschiedlichen werten der gleiche Wert ausspuckt .
 

Landei

Top Contributor
[c]this.getRow() == ((Square) obj).getRow()[/c] funktioniert nur, wenn deine row ein primitiver Typ (int, long,...) ist. Ist sie ein Objekt, musst du natürlich [c]equals[/c] nehmen. Ist sie ein Array, musst du [c]java.util.Arrays.equals(array1,array2)[/c] verwenden.

Das eigentliche Problem mit dem Code ist, dass du value zweimal etwas zuweist, und beim zweiten Mal wird natürlich der alte Inhalt von value überschrieben. Nimm zwei unterschiedliche Variablen, und verknüpfe sie mit [c]&&[/c], denn Zeilen und Spalten müssen gleich sein.
 
Zuletzt bearbeitet:

HazelNut

Mitglied
col und row sind ints in dieser Klasse.

Weshalb mein value falsch sein soll verstehe ich irgendwie nicht so ganz.
Wenn es in der ersten Zeile zutrifft ist es true, wenn es in der zweiten Zeile unterschiedliche Werte sind wird es auf false gesetzt und auch so ausgegeben.
Das man es mit && machen kann ist klar nur sehe ich eben keinen Unterschied.

Bähhh, vergesst den obigen Text -_- Umgekehrt trifft es ja nicht zu.. :bloed:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H double dispatch und equals(Object) Allgemeine Java-Themen 6
P JDK nicht installiert in Net Object Fusion Allgemeine Java-Themen 7
Erwin82a Object cannot be converted to Custom Class in Lampda Expression Allgemeine Java-Themen 2
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
MoxxiManagarm Mapping into existing object Allgemeine Java-Themen 15
coolian Swing erstellt fillreckt immmer ein neues object Allgemeine Java-Themen 13
N Wo ist Object.class ? Allgemeine Java-Themen 0
R Erste Schritte Object reference funktioniert nicht. Wie mach ichs richtig? Allgemeine Java-Themen 3
RalleYTN Datentypen Herausfinden ob Object ein Array ist ohne den Typen des Arrays zu kennen? Allgemeine Java-Themen 12
N Gibt es etwas allgemeineres as Object? Allgemeine Java-Themen 16
Bananabert Swing jtree : image als user object Allgemeine Java-Themen 2
N ArrayList in eigenem Object nicht richtig serialisierbar Allgemeine Java-Themen 14
B [Android] EditText-Object ist null - Nimmt nicht den Wert des enthaltenen Textfeldes ein Allgemeine Java-Themen 2
Z Vergleich zwischen int und Object Allgemeine Java-Themen 1
D Object nach Vererbung mit Class Object überprüfen Allgemeine Java-Themen 4
T InvalidClassException - Read null attempting to read class descriptor for object Allgemeine Java-Themen 8
J Ist eine Instanz von einem bestimmten Object Typ? Allgemeine Java-Themen 6
L Sortieren von "Map<String, Object>" Allgemeine Java-Themen 2
M Cast double[]-->Object[] oder Vector<double[]> Allgemeine Java-Themen 3
G REST- Object darstellung Allgemeine Java-Themen 6
darekkay Generics: Wildcard und Object Allgemeine Java-Themen 5
O Socket Object wird scheinbar falsch empfangen Allgemeine Java-Themen 6
N Klasse/Object Eigenaufruf Allgemeine Java-Themen 5
G JNI Shared Object Allgemeine Java-Themen 10
B Variable class in java.lang.Object Allgemeine Java-Themen 11
S Klassen Zuorgnung Object-char Allgemeine Java-Themen 2
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
S Type mismatch: cannot convert from Object to float Allgemeine Java-Themen 3
A Input/Output Serialisierung und Object.hashCode() Allgemeine Java-Themen 3
M Jaxb und JPA: A cycle is detected in the object graph Allgemeine Java-Themen 5
J Datentypen Problem mit Date-Object Allgemeine Java-Themen 2
B Variablen Alle RenderingHints.Keys (KEY_*) in Array + alle RenderingHints.Keys (VALUE_*) in Object[] Allgemeine Java-Themen 8
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
L Object Instanz anhand eines Strings Allgemeine Java-Themen 10
A Datei als Object einlesen und das Object als Singleton instance setzen. Allgemeine Java-Themen 13
DEvent embedded Object Database in Text Format Allgemeine Java-Themen 5
J Casting Problem Object, Double und String Allgemeine Java-Themen 3
M Object-Instanz in Date übersetzen Allgemeine Java-Themen 6
P Tree Object structure Allgemeine Java-Themen 19
G Object mit clone kopieren Allgemeine Java-Themen 21
J merkwürdig: Object Allgemeine Java-Themen 6
woezelmann Object nach Deserialisierung nicht mehr gleich Allgemeine Java-Themen 13
Iron Monkey Object in Datei effizienter lesen / schreiben Allgemeine Java-Themen 13
L Object = null? Allgemeine Java-Themen 16
dayaftereh Serializable und Object In/Out Stream Allgemeine Java-Themen 2
T Object auf Double, Int, String testen Allgemeine Java-Themen 5
N serialize deserialize java object über string Allgemeine Java-Themen 8
N getName() of reflection Object Allgemeine Java-Themen 4
B Probelm mit File Object Allgemeine Java-Themen 6
G NoClassDefFoundError: java/lang/Object Allgemeine Java-Themen 4
S Liste Object Löschen Allgemeine Java-Themen 7
P not enough space for object heap - Trotz mehr RAM? Allgemeine Java-Themen 6
MQue List<String> aus List<Object> generieren Allgemeine Java-Themen 2
M ArrayList<Object[]> und toArray() Allgemeine Java-Themen 5
Daniel_L LinkedList vom Typ Object-Array? Allgemeine Java-Themen 4
B Warum return type Object ? Allgemeine Java-Themen 4
D Generisches Object erstellen Allgemeine Java-Themen 2
M Databinding von Object zu properties-Datei Allgemeine Java-Themen 10
P Wieso HashMap-Zugriff mit Object, statt mit MyObject? Allgemeine Java-Themen 12
A NullPointer bei konvertierung von byteArr --> Object Allgemeine Java-Themen 3
foobar Object to byte[] ohne Serializable Allgemeine Java-Themen 6
reibi Object clonen spezial Allgemeine Java-Themen 8
C casten vom Typ Object nach Double[][] Allgemeine Java-Themen 2
X cannot convert from Object[] to Integer[] Allgemeine Java-Themen 2
G JSON Object auslesen Allgemeine Java-Themen 1
T cast Object to Double[] Allgemeine Java-Themen 2
G Object. Wrapper Allgemeine Java-Themen 12
V Object durchsuchen Allgemeine Java-Themen 4
U eigene Datenstruktur ArrayList<String> nach Object [][ Allgemeine Java-Themen 2
T "Object o = new Object()" vs. "new Object()&q Allgemeine Java-Themen 8
T Object -> byte[] Allgemeine Java-Themen 5
M Implementation von Zugriffen auf Object[index] in der JVM Allgemeine Java-Themen 9
T Klasse => Primitiv ? Object instanceof Klasse Allgemeine Java-Themen 2
B mit methode ein object zurückgeben. Allgemeine Java-Themen 5
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
T HashMap (String, Object(String , int)) nach int sortieren Allgemeine Java-Themen 7
P Typ Object in socket umwandeln Allgemeine Java-Themen 4
G Object cast via Reflection Allgemeine Java-Themen 8
Zed JList Object einfügen und Text anzeigen Allgemeine Java-Themen 3
MQue Object in Integer umwandeln Allgemeine Java-Themen 3
G Error: Hashtable Type safety: The method put(Object, Object) Allgemeine Java-Themen 6
T double to object Allgemeine Java-Themen 3
S File Object zu Directory machen ? Allgemeine Java-Themen 9
V Brauche dringend Hilfe. Object-handling Allgemeine Java-Themen 4
N Warning "The Cast from Object to" Allgemeine Java-Themen 9
K Threads und ein übergeordnetes Object Allgemeine Java-Themen 7
F Zugriff mittels getObject() oder this.object ? Allgemeine Java-Themen 8
W Object -> isPrimitiv? Allgemeine Java-Themen 7
D Cast schlägt fehl : Object[] zu Button[] Allgemeine Java-Themen 2
S Object nach Integer umwandeln Allgemeine Java-Themen 13
R object zu array casten. Allgemeine Java-Themen 2
N Map Object Allgemeine Java-Themen 13
G Eine C/C++ Referenz in einem Java Object speichern Allgemeine Java-Themen 5
N Ermitteln welchen Typ ein "Object"-Objekt enthält Allgemeine Java-Themen 11
K Cast ohne neues Object zu erzeugen Allgemeine Java-Themen 12
D Object in int casten Allgemeine Java-Themen 7
N Object-Array mit Comparator absteigend sortieren? Allgemeine Java-Themen 10
D Object to Long casting Allgemeine Java-Themen 9
G Object mit static Feldern speichern Allgemeine Java-Themen 9
D vergleichbare Object-Objekte generisch vergleichen Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben