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();