'When trying to overwrite a equals method in Java, it won't compare the values only the object itself?

In this exercise, I need to create a equals() method for a Drink class. Two drinks are the same if they have the same name and same size. I am receiving false from testing the method, even though I'm certain it should be true.

The main code:

public class Drink {
    private String name;
    private double size;
    
    public Drink(String name, double size) 
    {
        this.name = name;
        this.size = size;
    }
    
    public String getName()
    {
        return name;
    }
    
    public double getSize()
    {
        return size;
    }
    
//I tried to stringify the double values

    public boolean equals(Drink a, Drink b){
        String q = String.valueOf(a.getSize());
        String w = String.valueOf(b.getSize());
        if(q.equals(w) && a.getName().equals(b.getName())){
            return true;
        }
        else{
            return false;
        }
    }
}

The tester Code:

public class DrinkTester
{
    
    public static void main(String[] args)
    {
        Drink one = new Drink("Soda", 12);
        Drink two = new Drink("Soda", 12);
        Drink three = new Drink("Soda", 20);
        System.out.println(one.equals(two));
        System.out.println(one.equals(three));
    }
}


Solution 1:[1]

You need to override the equals method, if you use the @Override annotation you'll see if you're doing it right.

public boolean equals(Object obj) {
  return (this == obj);
}

That is the Object one, so yours might for example look like:

    @Override
    public boolean equals(Object obj) {
    if (this == obj) return true;
    if (obj == null || getClass() != obj.getClass()) return false;
    Drink drink = (Drink) obj;
    return this.size.equals(drink.size) 
     && this.name.equals(drink.name);
}

you'll also have to override your hashCode if you want your code to work optimally.

(And i've only recently noticed that if you use Objects.hash in your overridden hashCode method, your overridden equals method won't get used, the Objects one will get used instead)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1