Objekte mittels equals vergleichen

Ich versuche gerade, 2 Point-Objekte mittels equals zu vergleichen. Obwohl ich äquivalente Werte eingebe, ist equals der Ansicht, dass meine beiden Objekte nicht der Fall ist.

Der code wird anstandslos kompiliert, die Ausführung ist ebenso reibungslos. Eben bis auf dem Umstand, dass das Resultat nicht meinen Erwartungen entspricht. Ich erhalte:
Die zwei Objekte sind nicht aequivalent: Point [x=7, y=99] unterscheidet sich von Point [x=7, y=99]

Ich kann meinen Denkfehler nicht finden.
Und da ich keine Fehlermeldung erhalte, kann ich nicht danach googeln.

Was ich über equals weiss:
- die equals-Methode wird in der Klasse definiert. Die Klasse importiere ich in diesem Fall hier. Dort ist, laut Dokumentation, ein equals integriert.
- equals vergleicht die Objekte, NICHT die Referenzvariable. In meinem Fall werden also die int-Variablen der beiden Objekte verglichen.

Vielen Dank für eure Hilfe!



import java.awt.*;
class kapitel27verdammtesEquals
{
public static void main ( String arg[] )
{
Point pointA = new Point( 7, 99 ); // erstes Point-Objekt
Point pointB = new Point( 7, 99 ); // zweites Point-Objekt

if ( pointA.equals( pointB ) )
System.out.println("Die zwei Objekte enthalten die gleichen Daten: " + pointA );
else
System.out.println("Die zwei Objekte sind nicht aequivalent: " + pointA + " unterscheidet sich von " + pointB);
}
}
 
K

kneitzel

Gast
Welche JRE / JDK nutzt du? Dein Code gibt bei mir aus: "Die zwei Objekte enthalten die gleichen Daten: java.awt.Point[x=7,y=99]"

Und Code bitte mit Code-Tags posten:
Java:
import java.awt.*;
class kapitel27verdammtesEquals
{
  public static void main ( String arg[] )
  {
    Point pointA = new Point( 7, 99 ); // erstes Point-Objekt
    Point pointB = new Point( 7, 99 ); // zweites Point-Objekt

    if ( pointA.equals( pointB ) )
      System.out.println("Die zwei Objekte enthalten die gleichen Daten: " + pointA );
    else
      System.out.println("Die zwei Objekte sind nicht aequivalent: " + pointA + " unterscheidet sich von " + pointB);
  }
}
 

Oneixee5

Top Contributor
Dein Code erzeugt bei mir die Ausgabe:
Code:
Die zwei Objekte enthalten die gleichen Daten: java.awt.Point[x=7,y=99]
 
@Oneixee5: Danke für deine Nachricht.

Ich hab' natürlich vor dem Posten hier mehrmals neu kompiliert& ausgeführt. Erhielt aber immer das "falsche" Ergebnis.
Jetzt hab' ich Visual Code geschlossen und neugestartet. Siehe da; richtiger Output kommt!

Naja, war wohl falscher Alarm von mir.
Sorry für die Umstände und danke für die Hilfe.
Markus
 
@JustNobody: Danke auch für deinen Hinweis. Code-tag mache ich das nächste Mal.

Hier die Infos zu meiner IDE. Das Problem taucht zwar nicht mehr auf. Aber falls Irrtum meinerseits ausgeschlossen werden kann (was nicht der Fall ist ;-)), gibt's vielleicht noch einen Hinweis auf mögliche Ursachen:
Visual Studio Code

Version: 1.48.1 (user setup)
Commit: 3dd905126b34dcd4de81fa624eb3a8cbe7485f13
Datum: 2020-08-19T17:12:13.244Z
Electron: 7.3.2
Chrome: 78.0.3904.130
Node.js: 12.8.1
V8: 7.8.279.23-electron.0
Betriebssystem: Windows_NT x64 10.0.19041

Die Ausgabe bei mir ist übrigens:
"Die zwei Objekte sind nicht aequivalent: Point [x=7, y=99] unterscheidet sich von Point [x=7, y=99]"
 
aargh, in der weiterentwickelten Version meines codes taucht das Problem wieder auf!
Die erwartete Ausgabe ist "Die Koordinaten der beiden Punkte sind gleich.", ich erhalte jedoch "Die Koordinaten der beiden Punkte sind verschieden.".


Java:
import java.util.Scanner;
import java.awt.*;

public class kapitel27a1mitFertigerKlasse {
    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);

        //Punkt 1 einlesen mittels Scanner
        System.out.println("Gib die x-Koordinate ein");
        int x1 = scan.nextInt();
        System.out.println("Gib die y-Koordinate ein");
        int y1 = scan.nextInt();
        Point P1= new Point (x1, y1);

        //Punkt 2 einlesen mittels Scanner
        System.out.println("Gib die x-Koordinate ein");
        int x2 = scan.nextInt();
        System.out.println("Gib die y-Koordinate ein");
        int y2 = scan.nextInt();
        Point P2= new Point (x2, y2);
        
        //Punkte ausgeben, toString-Methode testen
        System.out.println ("P1 = "+P1.toString());
        System.out.println ("P2 = "+P2.toString());
        System.out.println(); //zur besser Lesbarkeit
    
        //Punkte vergleichen, ternar testen
        System.out.println("Ausgabe nach ternaer:");
        String equalsResult = (P1.equals(P2))
        ? "Die Koordinaten der beiden Punkte sind gleich."
        : "Die Koordinaten der beiden Punkte sind verschieden.";
        System.out.println(equalsResult);
        System.out.println(); //zur besser Lesbarkeit

        //Punkte vergleiche. Braves If zum Quer-Testen des equals
        System.out.println("Ausgabe nach if:");
        if (P1.equals(P2)){
            System.out.println("Die Koordinaten der beiden Punkte sind gleich.");
        } else {
            System.out.println("Die Koordinaten der beiden Punkte sind verschieden.");
        }
    }
}

Meine Eingabe für alle per scanner abgefragten Werte: 2

Meine Ausgabe:
Gib die x-Koordinate ein
2
Gib die y-Koordinate ein
2
Gib die x-Koordinate ein
2
Gib die y-Koordinate ein
2
P1 = Point [x=2, y=2]
P2 = Point [x=2, y=2]

Ausgabe nach ternaer:
Die Koordinaten der beiden Punkte sind verschieden.

Ausgabe nach if:
Die Koordinaten der beiden Punkte sind verschieden.


Infos zu meiner IDE Visual Studio Code:
Version: 1.48.1 (user setup)
Commit: 3dd905126b34dcd4de81fa624eb3a8cbe7485f13
Datum: 2020-08-19T17:12:13.244Z
Electron: 7.3.2
Chrome: 78.0.3904.130
Node.js: 12.8.1
V8: 7.8.279.23-electron.0
Betriebssystem: Windows_NT x64 10.0.19041

Weder beim Kompilieren noch beim Ausführen irgendwelche Fehlermeldungen.

Danke für eure Hilfe.
Gruss, Markus
 

Oneixee5

Top Contributor
Eventuell solltest du vor dem Compilieren die bestehenden Binaries löschen. So kannst du sicher sein, dass alles neu erstellt wurde. Möglicherweise gibt es Probleme beim überschreiben der .class Dateien.
 
Eventuell solltest du vor dem Compilieren die bestehenden Binaries löschen. So kannst du sicher sein, dass alles neu erstellt wurde. Möglicherweise gibt es Probleme beim überschreiben der .class Dateien.
Danke für den Tipp!
Ich habe das ausprobiert; .class-file gelöscht, Visual Studio neugestartet, .java neu kompiliert, neues .class ausgeführt - keine veränderung.

Ich habe nochmal die Spezifikation der equal-Methode in der Point-class nachgeschaut. Ich habe den Eindruck, dass dort das Problem liegt. So weit ich das verstehe, steht dort aber nichts ungewöhnliches.

Gruss,
Markus
 

LimDul

Top Contributor
Irgendwas ist strange bei dir:

Gib die x-Koordinate ein
2
Gib die y-Koordinate ein
2
Gib die x-Koordinate ein
2
Gib die y-Koordinate ein
2
P1 = java.awt.Point[x=2,y=2]
P2 = java.awt.Point[x=2,y=2]

Ausgabe nach ternaer:
Die Koordinaten der beiden Punkte sind gleich.

Ausgabe nach if:
Die Koordinaten der beiden Punkte sind gleich.

Welche Java Version ist den installiert?
 
LimDul:
Du hast nicht zufällig eine Klasse namens "Point" im gleichen Package liegen? Dann wird natürlich die verwendet und nicht mehr die aus java.awt
Das war das Problem!
Ich hab heute morgen mit einer eigenen Point-Class herumgebastelt. Meine selbergemachte Point-Class hatte kein toString, darum habe ich danach die offizielle Point-class importiert.
Meine selbergemachte Point-Klasse wird zwar weder importiert noch deklariert im aktuellen .java-file, liegt aber vielleicht irgend in einem temporary oder so rum. Das .java-file mit der selbergemachten Klasse ist im gleichen Ordner wie das kapitel27a1mitFertigerKlasse.java.

Ich habe nun einen neuen Ordner erstellt, kapitel27a1mitFertigerKlasse.java dort rein kopiert, die IDE sicherheitshalber neu gestartet, das .java neu kompiliert und ausgeführt - tadaa, es tut wie's soll!
Es war also tatsächlich meine selbergebastelte Point-Class, die das Problem verursacht hat.

Das bedeutet vermutlich, dass lokal deklarierte Klassen die importierten Klassen gewissermassen überschreiben. Obwohl es keinen manuellen Aufruf meiner eigenen Klasse gab, nur den import der offiziellen Klasse.

Vielen Dank für eure Hilfe! Ich hoffe mein Fehler war nicht allzu dämlich ;-)
Gruss, Markus
 

LimDul

Top Contributor
Das war das Problem!
Ich hab heute morgen mit einer eigenen Point-Class herumgebastelt. Meine selbergemachte Point-Class hatte kein toString, darum habe ich danach die offizielle Point-class importiert.
Meine selbergemachte Point-Klasse wird zwar weder importiert noch deklariert im aktuellen .java-file, liegt aber vielleicht irgend in einem temporary oder so rum. Das .java-file mit der selbergemachten Klasse ist im gleichen Ordner wie das kapitel27a1mitFertigerKlasse.java.

Ich habe nun einen neuen Ordner erstellt, kapitel27a1mitFertigerKlasse.java dort rein kopiert, die IDE sicherheitshalber neu gestartet, das .java neu kompiliert und ausgeführt - tadaa, es tut wie's soll!
Es war also tatsächlich meine selbergebastelte Point-Class, die das Problem verursacht hat.

Das bedeutet vermutlich, dass lokal deklarierte Klassen die importierten Klassen gewissermassen überschreiben. Obwohl es keinen manuellen Aufruf meiner eigenen Klasse gab, nur den import der offiziellen Klasse.

Vielen Dank für eure Hilfe! Ich hoffe mein Fehler war nicht allzu dämlich ;-)
Gruss, Markus
Das ist die Packagestruktur von Java.
Klassen im gleichen Package haben immer Präferenz vor importierten. Grundsätzlich hat jede Klasse einen voll qualifizierten Namen. der ist bei normalen Klassen package.klassenname (mal inner classes und co außen vorgelassen).

Das Import statement sorgt dafür, dass du dir das Package sparen kannst. Wenn es dabei aber zu Konflikten kommt gilt das Klassen aus dem gleichen Package Vorrang haben. Du hättest im Code anstelle von import und der Verwendung von Point auch immer java.awt.Point schreiben können - also den vollqualifizierten Namen.
 
Das ist die Packagestruktur von Java.
Klassen im gleichen Package haben immer Präferenz vor importierten. Grundsätzlich hat jede Klasse einen voll qualifizierten Namen. der ist bei normalen Klassen package.klassenname (mal inner classes und co außen vorgelassen).

Das Import statement sorgt dafür, dass du dir das Package sparen kannst. Wenn es dabei aber zu Konflikten kommt gilt das Klassen aus dem gleichen Package Vorrang haben. Du hättest im Code anstelle von import und der Verwendung von Point auch immer java.awt.Point schreiben können - also den vollqualifizierten Namen.
Danke für die Erklärung!

Ich hab' das gleich ausprobiert. Nun kann ich auch in meinem bestehenden Ordner mit mehreren Point-class die richtige class aufrufen.
Hier der Code, falls jemand das gleiche Problem hat:
Java:
import java.util.Scanner;

public class kapitel27a1mitFertigerKlasse {
    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);

        //Punkt 1 einlesen mittels Scanner
        System.out.println("Gib die x-Koordinate ein");
        int x1 = scan.nextInt();
        System.out.println("Gib die y-Koordinate ein");
        int y1 = scan.nextInt();
        java.awt.Point P1= new  java.awt.Point (x1, y1);

        //Punkt 2 einlesen mittels Scanner
        System.out.println("Gib die x-Koordinate ein");
        int x2 = scan.nextInt();
        System.out.println("Gib die y-Koordinate ein");
        int y2 = scan.nextInt();
        java.awt.Point P2= new  java.awt.Point (x2, y2);
    
        //Punkte ausgeben, toString-Methode testen
        System.out.println ("P1 = "+P1.toString());
        System.out.println ("P2 = "+P2.toString());
        System.out.println(); //zur besser Lesbarkeit
    
        //Punkte vergleichen, ternar testen
        System.out.println("Ausgabe nach ternaer:");
        String equalsResult = (P1.equals(P2))
        ? "Die Koordinaten der beiden Punkte sind gleich."
        : "Die Koordinaten der beiden Punkte sind verschieden.";
        System.out.println(equalsResult);
        System.out.println(); //zur besser Lesbarkeit

        //Punkte vergleiche. Braves If zum Quer-Testen des equals
        System.out.println("Ausgabe nach if:");
        if (P1.equals(P2)){
            System.out.println("Die Koordinaten der beiden Punkte sind gleich.");
        } else {
            System.out.println("Die Koordinaten der beiden Punkte sind verschieden.");
        }
    }
}

Danke nochmal! Durch eure Hilfe wurden ein paar Stunden voller Frust von einer Woge des Erfolgs abgelöst ;-)
Gruss,
Markus
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Objekte mittels Schleife anlegen und ansprechen Java Basics - Anfänger-Themen 8
D Initialisierung von Klassen-Objekte Java Basics - Anfänger-Themen 47
W Objekte erzeugen Httprequest oder Httpclient Java Basics - Anfänger-Themen 3
richis-fragen Kann Arrays.stream() auch auf Objekte angewant werden? Java Basics - Anfänger-Themen 10
krgewb Über Objekt, das Objekte desselben Typs enthält iterieren Java Basics - Anfänger-Themen 5
I Zapier -> wie werden Objekte gespeichert? Java Basics - Anfänger-Themen 10
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
K Hab ich dass so richtig erklärt (Objekte und Referenzen)? Java Basics - Anfänger-Themen 5
J Objekte in JSON speichern?? Java Basics - Anfänger-Themen 1
I Objekte in ShareProject speichern um später zu nutzen Java Basics - Anfänger-Themen 4
J Objekte Java Basics - Anfänger-Themen 22
T Objekte mit arrays erstellen Java Basics - Anfänger-Themen 6
Hzrfa Objekte, Referenz Java Basics - Anfänger-Themen 5
T 3D Objekte verarbeiten Java Basics - Anfänger-Themen 2
N Welche Objekte kann man zu einem Set hinzufügen Java Basics - Anfänger-Themen 4
I XML einlesen und Objekte bekommen Java Basics - Anfänger-Themen 2
W Objekte einer ArrayList in txt-datei schreiben mit Paths? Java Basics - Anfänger-Themen 2
Encera Zugriff auf Map-Objekte Java Basics - Anfänger-Themen 3
E Objekte löschen Java Basics - Anfänger-Themen 9
P Array-Objekte-Aufruf Java Basics - Anfänger-Themen 22
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
B Objekte verschwinden beim Übersetzen Java Basics - Anfänger-Themen 5
D Zwei verschiedene Intellij Projekte, wie benutze ich wechselseitig objekte Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
F Aus eingelesener Datei korrekt Objekte erzeugen Java Basics - Anfänger-Themen 5
G Übergeordnete Objekte abrufen Java Basics - Anfänger-Themen 9
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
A Objekte mit Parametern in eine Liste packen Java Basics - Anfänger-Themen 19
B Objekte, bspw. konkret Arraylists,manuell aus Speicher löschen? Java Basics - Anfänger-Themen 70
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
D Wie Objekte im JFrame frei bewegen lassen? Java Basics - Anfänger-Themen 3
Spandeli8 Erzeugte Objekte gegenüber Bildern hervorheben in Java Processing Java Basics - Anfänger-Themen 1
J Zwei Objekte vergleichen Java Basics - Anfänger-Themen 8
L Werte von Objekte addieren Java Basics - Anfänger-Themen 14
U Objekte in LinkedList löschen und editieren Java Basics - Anfänger-Themen 14
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
G Methoden Informationen aus zwei Objekte bekommen? Java Basics - Anfänger-Themen 6
P Globale Objekte Java Basics - Anfänger-Themen 2
C Nachträglich neue grafische Objekte hinzufügen Java Basics - Anfänger-Themen 7
D Interaktion zweier Objekte Java Basics - Anfänger-Themen 5
M Objekte in Array speichern und ausgeben Java Basics - Anfänger-Themen 17
S Objekte indiziert erstellen Java Basics - Anfänger-Themen 27
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
N Typebound Objekte einer Arraylist hinzufügen Java Basics - Anfänger-Themen 7
A (Objekte Java Basics - Anfänger-Themen 6
Y Klassen Klassen und Objekte Java Basics - Anfänger-Themen 3
Y Klassen Klassen und Objekte mit set und get Java Basics - Anfänger-Themen 0
U Objekte in einer LinkedList sortieren Java Basics - Anfänger-Themen 5
N Methode um Objekte einer Liste hinzuzufügen Java Basics - Anfänger-Themen 1
G Java Objekte auf Duplikate testen Java Basics - Anfänger-Themen 4
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
M Implementieren einer Datenstruktur, welche nur 5 Objekte speichert Java Basics - Anfänger-Themen 3
M Objekte miteinander vergleichen Java Basics - Anfänger-Themen 18
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
J Java GUI- Objekte Position per Quelltext bestimmen Java Basics - Anfänger-Themen 4
G Objekte in Methoden? Java Basics - Anfänger-Themen 13
H Auf Objekte bzw Variabeln aus einer anderen Methode zugreifen Java Basics - Anfänger-Themen 7
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
K Boolean in einer Methode um 2 Objekte zu vergleichen Java Basics - Anfänger-Themen 12
I Objekte Hilfe Java Basics - Anfänger-Themen 8
G Klassen und Objekte Java Basics - Anfänger-Themen 2
W Verschachtelte Objekte wieder auspacken Java Basics - Anfänger-Themen 3
R Attribute mehrerer Objekte ausgeben Java Basics - Anfänger-Themen 3
C Objekte und Konstruktoren Java Basics - Anfänger-Themen 2
F Erstellen zweier Objekte mit dem selben Inhalt Java Basics - Anfänger-Themen 1
O ObjectOutputStream Anzahl Objekte festhalten Java Basics - Anfänger-Themen 17
R Objekte aus Array als String + kommasepariert speichern Java Basics - Anfänger-Themen 12
X Objekte einer ArrayList richtig ausgeben? Java Basics - Anfänger-Themen 8
J Best Practice Dateiinhalte validieren und auf Objekte mappen Java Basics - Anfänger-Themen 3
B Automatisch Objekte erzeugen mit verschiedenen Namen Java Basics - Anfänger-Themen 4
der_Schokomuffin Hilfe gesucht beim Thema Objekte übergeben! Java Basics - Anfänger-Themen 2
S Konstruktor, Objekte Java Basics - Anfänger-Themen 4
PaperHat Objekte in Array vergleichen Java Basics - Anfänger-Themen 9
B HTML Code / Seite auslesen und JAVA Objekte erstellen Java Basics - Anfänger-Themen 12
PaperHat Programmieraufgabe - Objekte in Objekten Java Basics - Anfänger-Themen 2
E Methode mit Parametern um Objekte zu übergeben Java Basics - Anfänger-Themen 4
V Collections Objekte einer ArrayList in der main() ausgeben Java Basics - Anfänger-Themen 9
T Klassen Klassenübergreifende Objekte erstellen lassen Java Basics - Anfänger-Themen 5
A Objekte verknüpfen Java Basics - Anfänger-Themen 2
M Objekte mit einer Schleife mehrmals erzeugen Java Basics - Anfänger-Themen 17
B Klassen Alle Unter-Objekte durchlaufen in der Hauptklasse Java Basics - Anfänger-Themen 10
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
S Zählen der Zeiger auf Objekte Java Basics - Anfänger-Themen 35
J Methoden Equals Methode für Integer und Objekte überschreiben? Java Basics - Anfänger-Themen 9
B Erste Schritte Objekte von JFrame der Fenstergröße anpassen Java Basics - Anfänger-Themen 3
M Klassen und Objekte Java Basics - Anfänger-Themen 2
J Objekte und Abstrakte Klassen Java Basics - Anfänger-Themen 2
J Array Objekte einer Klasse zuordnen Java Basics - Anfänger-Themen 15
H Interface Objekte speichern und laden (serialisieren/deserialisieren) Java Basics - Anfänger-Themen 1
Orkanson Objekte in ein Array einfügen Java Basics - Anfänger-Themen 5
X Objekte in ArrayList einfügen Java Basics - Anfänger-Themen 10
L Vorherige Objekte zählen und ausgeben Java Basics - Anfänger-Themen 11
Orkanson Objekte und Klassen Java Basics - Anfänger-Themen 8
R Objekte zur Laufzeit in Schleife erzeugen und in ArrayList ablegen Java Basics - Anfänger-Themen 4
D Objekte-Fragen Java Basics - Anfänger-Themen 1
T Objekte in der Methode Java Basics - Anfänger-Themen 8

Ähnliche Java Themen


Oben