LocalDate:等于与 isEqual

Posted

技术标签:

【中文标题】LocalDate:等于与 isEqual【英文标题】:LocalDate: equals vs isEqual 【发布时间】:2021-08-11 07:44:11 【问题描述】:

Java 中的LocalDate 有两个类似的方法equalsisEqual

它们之间有什么区别?他们什么时候输出不同的结果?

【问题讨论】:

你读过documentation吗?它详细解释了差异。 @HenryTwist,你能解释一下吗? 【参考方案1】:

equals() 方法将给出与isEqual() 相同的结果,但前提是传递的参数类型相同(在本例中为LocalDate)。

isEqual() 可以用ChronoLocalDate 调用(JapaneseDateThaiBuddhistDate...)

public boolean isEqual(ChronoLocalDate other)

如果参数不是LocalDateequals() 将返回 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 的值?

急求,用JAVA编写,键盘输入生日,用LocalDate写

如何将 LocalDate 格式化为字符串?

最全的时间类解析。 SimpleDateFormat + Date() 和 DateTimeFormatter + LocalDate()的区别与使用场景