java.util.Date equals()和getTime()的值

java.util.Date equals()和getTime()的值,java,Java,这两者的区别是什么: java.util.Date obj1; java.util.Date obj2; obj1.equals(obj2) obj1.getTime() == (obj2.getTime()) 它有毫秒差吗?请参阅以下的实现: 它使用getTime方法进行比较 返回“自1970年1月1日00:00:00 GMT以来的毫秒数”,您不能对其使用等于,因为它是长,请参见其签名: public long getTime() 因此,你应该简单地: obj1.equals(obj2)

这两者的区别是什么:

java.util.Date obj1;
java.util.Date obj2;

obj1.equals(obj2)
obj1.getTime() == (obj2.getTime())
它有毫秒差吗?

请参阅以下的实现:

它使用
getTime
方法进行比较

返回“自1970年1月1日00:00:00 GMT以来的毫秒数”,您不能对其使用
等于
,因为它是
,请参见其签名:

public long getTime()
因此,你应该简单地:

obj1.equals(obj2)

或者使用
=
运算符比较从
getTime
返回的值,第一个值与
日期进行比较。第二个是不可编译的,因为
long
(由
getTime()
返回)是一个基元类型,并且不能对基元类型调用
方法。

中定义的
equals
方法只检查
getTime()
是否为两个对象返回相同的值。因此,使用
equals
和自己检查
getTime()
值之间应该没有什么区别。如果这些图书馆都写得很好,就不会有了

但是,
Date
()的至少一个子类重写了
equals
,并将其含义更改为与其基类不一致。因此,如果一个
Date
对象恰好是
时间戳,那么它的
equals
方法可能会产生不同的结果
obj1.getTime().equals(obj2.getTime())无法编译,因为
Date\getTime
返回一个没有任何方法的原语
long`

另一方面,如果说
obj1.getTime()==obj2.getTime()
,那么这两条语句都不会有任何不同,因为
Date#equals
方法使用

return obj instanceof Date && getTime() == ((Date) obj).getTime();

第二个将导致编译器错误。:)

java.util.Date.getTime()
返回原语
long
,而不是对象类型
long
。不能对基元类型调用方法。 您正在查找,
Long.compare(obj1.getTime(),obj2.getTime())
,如果两者相等,则返回0。或者,也可以使用
Long.valueOf(obj1.getTime()).equals(Long.valueOf(obj2.getTime())
。这两种方法在调用方法之前将
Long
转换为
Long

其次,在这种特殊情况下,两种方法不会产生不同的结果。“.equals()'的意思是检查两个对象是否有意义地相等。与用单个
数字表示的
java.util.Date
不同,某些类的相等性可能由多个属性的值定义。例如,在一个房屋类中,相等性将由街道地址的总和定义,城市,邮政编码和国家。在这种情况下,
.equals()
将是实现平等的唯一途径

Date date1 = new Date();
Date date2 = new Date();
案例1:
date2.getTime==date1.getTime
此特定比较比较比较从1970年到两个日期对象实例的毫秒数。数据类型将为原始
long

案例2:
date2.equals(date1)
此特定比较执行以下操作:

公共布尔等于(对象obj){
返回obj instanceof Date&&getTime()==((日期)obj.getTime();
}


i、 案例2还比较了自1970年以来经过的毫秒数,并额外检查了可比日期是否为
date
对象的实例。

date#getTime
返回
long
,因此没有
equals
方法…@MadProgrammer“日期对象的比较比较对象本身,而不是内容”-错误-
返回对象实例of Date&&getTime()==((Date)obj).getTime()
您假设如果对
Date
对象调用
equals
,您将从
Date
获得
equals
实现。但是您可能从一个子类获得实现,该子类具有不同的确定相等性的方法,而不仅仅是检查
getTime()
field.OP在他们的示例中使用了
Date
。@marounnaroun不,他们有两个
Date
类型的变量。他们没有指定它们被实例化为
new Date
。如果您有两个
Date
变量作为函数参数,则有人可以使用两个
时间戳
s调用该函数。@khelwood you如果你是对的,我假设OP请求的是
Date
对象,而不是它的子类。但是,如果从本质上讲,你应该说
obj1.getTime()==obj2.getTime()
相反,这两个语句之间没有区别OP已经更新了问题,因此您的第一个语句是错误的。您的最后一个语句也是错误的-
返回obj instanceof Date&&getTime()=((Date)obj).getTime();
-来自
Date#equals
方法;)@MadProgrammer,第二条语句怎么了?.equals应该检查有意义的相等。对于Date类,有意义的相等被定义为具有相同的长值来表示它们。当我说长值表示相等时,我想这意味着这些类必须是相同的类型。听起来更像是你在说关于
equals
是检查一个对象是否等于另一个(=),而不是检查其内容是否匹配添加了澄清。
Date date1 = new Date();
Date date2 = new Date();