我有以下代码:
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
请更新此行为。 感谢
答案 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。