System.out.println(new Date().hashCode());哈希码值是否每次都不同



两个new Date()对象的哈希码什么时候可以相同?

例如,new Date()永远不会具有相同的值,那么每次运行此代码时哈希代码值会不同吗?

System.out.println(new Date().hashCode());

Date 的hashCode使用 getTime 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数,在快速现代机器上多次调用它很可能产生相同的值。

当我在我的机器上运行它时,它会产生以下内容:

 System.out.println(new Date().hashCode()); //1328556618
 System.out.println(new Date().hashCode()); //1328556618
 System.out.println(new Date().hashCode()); //1328556618

顺便说一句,多次调用System.currentTimeMillis()很可能会产生相同的值。

通常可以预期两个不相等的对象具有不同的哈希码。但根据合同,永远不能保证两个对象的哈希码会有所不同:

  • 如果根据 equals(java.lang.Object) 方法两个对象不相等,则对两个对象中的每一个调用 hashCode 方法必须产生不同的整数结果,这并不要求。

但是您关于每个新Date对象具有不同值的说法是不正确的。 Date只有毫秒精度,这意味着您可以在一行中生成许多具有相同值的对象。

根据Javadoc,hashCode计算如下:

(int)(this.getTime()^(this.getTime() >>> 32))
因此,两个日期的

哈希代码创建两个具有相同时间的日期:

Date d1 = new Date();
System.out.println(d1.hashCode());
Date d2 = new Date(d1.getTime());
System.out.println(d2.hashCode());  // Same as d1.hashCode();

或者将时间设置为相同:

Date d1 = new Date();
System.out.println(d1.hashCode());
Thread.sleep(1000);  // Just to make sure they're not the same time initially.
Date d2 = new Date();
System.out.println(d2.hashCode());  // Different to d1.hashCode();
d2.setTime(d1.getTime());
System.out.println(d2.hashCode());  // Same as d1.hashCode();

最新更新