Nhảy tới nội dung

Q & A

  • equals() and ==

Equality can be reference based or valued based:

  • == can be used for primitive types, because equality and reference checking work identically for primitives.
  • equals for object types (== performs reference check only)
public class Animal {
private String name;

public Animal (String name) { this.name = name; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public static void main(String args[]) {
List<Animal> animals = Arrays.asList(
new Animal("cat"),
new Animal("dog"),
new Animal("chicken"));

// these will print out false, false, false if you not implement `equals` and `hashCode`
System.out.println(animals.contains(new Animal("cat")));
System.out.println(animals.contains(new Animal("dog")));
System.out.println(animals.contains(new Animal("foo")));
}
}

Add these 2, then it will print out true, true, false.

    @Override
public boolean equals(Object object) {
if(this == object)
return true;
if(object == null || getClass() != object.getClass())
return false;
Animal animal = (Animal) object;
return Objects.equals(name, animal.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}