在LocalDate对象上使用equals和==

时间:2016-03-16 16:55:19

标签: java

我有以下代码:

LocalDate one = LocalDate.of(2016, 1, 1);
LocalDate two = LocalDate.of(2016, 1, 1);
System.out.println(one.equals(two)); // true since contents are same
System.out.println(one == two); // false since references are diff
LocalDate newone = one.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY));
System.out.println(newone.equals(one));// true since contents are still same
System.out.println(newone == one); //-4- why true here 

问题是为什么在4处它是真的,因为LocalDate对象是不可变的,所以用TemporalAdjuster改变一个会给出一个新的LocalDate对象。如果newone和one的内容不同于

newone == one returns false

请更新此行为。 感谢

3 个答案:

答案 0 :(得分:4)

查看TemporalAdjusters.nextOrSame的代码:

public static TemporalAdjuster nextOrSame(DayOfWeek dayOfWeek) {
    int dowValue = dayOfWeek.getValue();
    return (temporal) -> {
        int calDow = temporal.get(DAY_OF_WEEK);
        if (calDow == dowValue) {
            return temporal;  // <-- returns the original object!
        }
        int daysDiff = calDow - dowValue;
        return temporal.plus(daysDiff >= 0 ? 7 - daysDiff : -daysDiff, DAYS);
    };
}

来自documentation(强调我的):

  

返回下一个或相同的星期几调整器,它将日期调整为调整日期后指定星期几的第一次出现,除非它已经在那一天返回相同的对象

因此,如果不需要调整(因为2016年1月1日 星期五),那么将返回相同的对象。

答案 1 :(得分:0)

Answer by tobias_k是正确的。

避免对基于值的对象进行参考平等测试

我只想补充一点,一般来说,应该避免在Java中使用==,因为它只是测试引用相等性,询问两个引用变量是否指向在内存中分配的同一个对象。几乎总是调用equals或特定类的自己的相等测试方法是恰当的。

具体来说,LocalDate类doc警告反对对此类value-based类的对象执行此引用相等性测试。

  

这是一个基于价值的课程;在LocalDate的实例上使用身份敏感操作(包括引用相等(==),标识哈希代码或同步)可能会产生不可预测的结果,应该避免使用。等于方法应该用于比较。

虽然我理解user2779311似乎已经将此参考平等测试作为一项智力练习,但我想指出这样的测试在生产代码中通常是不合适的。

答案 2 :(得分:-1)

您可以在此处参考文档java docs

public LocalDate with(TemporalAdjuster adjuster)

返回此日期的调整副本。

因此返回的对象是对象的副本,因此引用是相同的,因此您的输出返回true。