'LocalDate: equals vs isEqual

LocalDate in Java has two similar methods equals and isEqual.

What's the difference between them? When do they output different results?



Solution 1:[1]

LocalDate.equals, like most other equals method implementations, will always return false if you pass it something other than a LocalDate, even if they represent the same day:

System.out.println(LocalDate.now().equals(HijrahDate.now())); // false

ChronoLocalDate.isEqual compares whether the two dates are the same day, i.e. the same point on the local time line:

System.out.println(LocalDate.now().isEqual(HijrahDate.now())); // true

Solution 2:[2]

The equals() method will give the same result as isEqual(), but only if the argument passed is of the same type (in this case, LocalDate).

isEqual() can be called with a ChronoLocalDate (JapaneseDate, ThaiBuddhistDate...)

public boolean isEqual(ChronoLocalDate other)

equals() will return false if the argument is not a LocalDate:

@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj instanceof LocalDate) {
        return compareTo0((LocalDate) obj) == 0;
    }
    return false;
}

Solution 3:[3]

equals() can handle any reference type

There are two good answers. For the sake of completeness I want to make explicit that the observation by Most Needed Rabbit implies that you can pass something that isn’t a ChronoLocalDate to equals() but not to isEqual(). For example:

    System.out.println(LocalDate.of(2021, Month.MAY, 26).equals("2021-05-26"));

Output:

false

This is standard behaviour of the equals method in Java.

Trying to use isEqual() similarly gives a compile error:

    System.out.println(LocalDate.of(2021, Month.MAY, 26).isEqual("2021-05-26"));

The method isEqual(ChronoLocalDate) in the type LocalDate is not applicable for the arguments (String)

Passing a string or yet a different type is not often useful, though.

equals() tolerates null; isEqual() does not

Possibly a bit more surprisingly the two methods also treat null differently.

    System.out.println(LocalDate.of(2021, Month.MAY, 26).equals(null));

false

    System.out.println(LocalDate.of(2021, Month.MAY, 26).isEqual(null));

Exception in thread "main" java.lang.NullPointerException

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 Sweeper
Solution 2
Solution 3