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