6 svar
140 visningar
Ygolopot behöver inte mer hjälp
Ygolopot 215
Postad: 26 jan 2022 08:41 Redigerad: 26 jan 2022 08:42

.equals för objekt, hur fungerar det?

Hej!

Jag udnrar hur .equals fungerar för objekt. Jag syftar på default-metoden från java.lang.Object. Jag har varit under intrycket att den jämför om referensen är samma, men när jag kör följande kod:

public class Person {
    private final String name;
    private int age;
    private double income;

    public Person(String name, int age, double income) {
        this.name = name;
        this.age = age;
        this.income = income;
    }

    public Person(String name) {
        this(name, 0, 0);
    }

 

I en annan fil i samma package och skapar objekten:

Person p1 = new Person("Sven", 24, 12000);
Person p2 = new Person("Sven", 25, 116000);
out.println(p1.equals(p2)); // Prints True!!

Så får jag alltså True, jag skapar väl två olika objekt i koden och referensen i p1 och p2 borde väl vara olika? Jag får True oavsett ålder och inkomst men när jag har olika namn då blir det false.

Någon som kan förklara för mig vad som händer här?

Tack på förhand :)

Laguna Online 30697
Postad: 26 jan 2022 09:27

Jag kan inte förklara just det du ser, men jag tror det är meningen att du ska skapa en egen equals-metod för din klass, som gör det du vill.

CurtJ 1203
Postad: 26 jan 2022 09:37

Vad är det för java-kompilator du använder och vad returnerar metoden hashCode() för p1 resp p2?

Ygolopot 215
Postad: 26 jan 2022 09:49

Hej! den här var en del av ett övningsexempel så jag antog att jag inte skulle skapa en egen metod men så kan det vara.

Jag får:

out.println(p1.hashCode()); //Gives 70653
out.println(p2.hashCode()); //Gifes 70653

Så jag får sama hashCode() på båda. Jag kan inte så mycket om hashCode() så vet inte om detta är det användandet av hashCode() som du syftar på dock.

Jag har javac 15.0.1 som java-kompilator!

Tack för svaren båda :)

CurtJ 1203
Postad: 26 jan 2022 09:54

Laguna har rätt. Om du vill använda equals för objekt så ska du implementera den OCH hashCode för den klassen. Har du en utvecklingsmiljö så kan det vara att den kan göra det åt dig. Equals implementerar man i regel så att den använder sig av hashCode för ingående attribut i objektet.

I ditt fall så använder Object.equals sig av Object.hashCode som returnerar samma värde för de båda objekten och därmed anser den dessa vara lika (inte samma). Hur hashCode är implementerad i ditt objekt kan man inte säga utan att titta på koden men det finns inget krav på att den skall vara unik per objekt så vitt jag vet.

Så följ Lagunas råd och implementera equals och hashCode i din egen klass.

Ygolopot 215
Postad: 26 jan 2022 09:56

Okej grymt, jag kör på det! Tack så mycket :)

Programmeraren 3390
Postad: 26 jan 2022 10:09

Om du utvecklar i en IDE, en "Integrerad utvecklingsmiljö", så kan det vara så att den är inställd på att generera equals() och hashCode() automatiskt.

Svara
Close