【发布时间】:2021-08-11 07:44:11
【问题描述】:
Java 中的LocalDate 有两个类似的方法equals 和isEqual。
它们之间有什么区别?他们什么时候输出不同的结果?
【问题讨论】:
-
你读过documentation吗?它详细解释了差异。
-
@HenryTwist,你能解释一下吗?
标签: java equals java-time localdate jsr310
Java 中的LocalDate 有两个类似的方法equals 和isEqual。
它们之间有什么区别?他们什么时候输出不同的结果?
【问题讨论】:
标签: java equals java-time localdate jsr310
equals() 方法将给出与isEqual() 相同的结果,但前提是传递的参数类型相同(在本例中为LocalDate)。
isEqual() 可以用ChronoLocalDate 调用(JapaneseDate,ThaiBuddhistDate...)
public boolean isEqual(ChronoLocalDate other)
如果参数不是LocalDate,equals() 将返回 false:
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof LocalDate) {
return compareTo0((LocalDate) obj) == 0;
}
return false;
}
【讨论】:
LocalDate.equals 与大多数其他 equals 方法实现一样,如果您将 LocalDate 以外的其他内容传递给它,将始终返回 false,即使它们代表同一天:
System.out.println(LocalDate.now().equals(HijrahDate.now())); // false
ChronoLocalDate.isEqual比较两个日期是否是同一天,即本地时间线上的同一点:
System.out.println(LocalDate.now().isEqual(HijrahDate.now())); // true
【讨论】:
有两个很好的答案。为了完整起见,我想明确指出,Most Needed Rabbit 的观察暗示您可以将不是ChronoLocalDate 的东西传递给equals(),但不能传递给isEqual()。例如:
System.out.println(LocalDate.of(2021, Month.MAY, 26).equals("2021-05-26"));
输出:
假
这是 Java 中 equals 方法的标准行为。
尝试使用isEqual() 同样会产生编译错误:
System.out.println(LocalDate.of(2021, Month.MAY, 26).isEqual("2021-05-26"));
LocalDate 类型中的方法 isEqual(ChronoLocalDate) 不是 适用于参数(字符串)
不过,传递字符串或不同的类型通常没有用处。
可能更令人惊讶的是,这两种方法对 null 的处理方式也不同。
System.out.println(LocalDate.of(2021, Month.MAY, 26).equals(null));
假
System.out.println(LocalDate.of(2021, Month.MAY, 26).isEqual(null));
线程“主”java.lang.NullPointerException 中的异常
【讨论】: