LocalDate:等于与 isEqual
Posted
技术标签:
【中文标题】LocalDate:等于与 isEqual【英文标题】:LocalDate: equals vs isEqual 【发布时间】:2021-08-11 07:44:11 【问题描述】:Java 中的LocalDate
有两个类似的方法equals
和isEqual
。
它们之间有什么区别?他们什么时候输出不同的结果?
【问题讨论】:
你读过documentation吗?它详细解释了差异。 @HenryTwist,你能解释一下吗? 【参考方案1】: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;
【讨论】:
【参考方案2】: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
【讨论】:
【参考方案3】:equals() 可以处理任何引用类型
有两个很好的答案。为了完整起见,我想明确指出,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) 不是 适用于参数(字符串)
不过,传递字符串或不同的类型通常没有用处。
equals() 容忍空值; isEqual() 没有
可能更令人惊讶的是,这两种方法对 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 中的异常
【讨论】:
以上是关于LocalDate:等于与 isEqual的主要内容,如果未能解决你的问题,请参考以下文章
Spring JPA Equal条件与LocalDate的派生查询不起作用
LocalDate LocalTime LocalDateTime Instant的操作与使用
Hibernate:如何将 java.util.Map 与 java.util.Set 映射为带有 LocalDate 的值?
最全的时间类解析。 SimpleDateFormat + Date() 和 DateTimeFormatter + LocalDate()的区别与使用场景