我试图通过跨多个线程使用 SimpleDateFormat 的相同实例来复制错误。然而,我遇到了另一个问题,并且没有找到任何答案。
这个简单的代码块复制了我所看到的问题。
DateFormat d1 = new SimpleDateFormat("ddMMyyyy");
DateFormat d2 = new SimpleDateFormat("ddMMyyyy");
DateFormat d3 = new SimpleDateFormat("ddMMyy");
System.out.println("d1 = " + d1);
System.out.println("d2 = " + d2);
System.out.println("d3 = " + d3);
在java 7(1.7_0_21)下此操作结果如下
d1 = java.text.SimpleDateFormat@c5bfbc60
d2 = java.text.SimpleDateFormat@c5bfbc60
d3 = java.text.SimpleDateFormat@b049fd40
正如您所看到的,虽然我为 d1 和 d2 创建新对象,但它们最终是相同的引用。由于模式不同,d3 最终成为一个新实例。
java编译/运行时是否进行此优化?任何指示都会有帮助
最佳答案
SimpleDateFormat
和 DateFormat
(SimpleDateFormat
父类(super class))和 Format
(DateFormat
父类(super class))都实现了 toString()
,因此实际上执行了 Object
类中的 toString()
,其代码为:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
现在,SimpleDateFormat
hashCode 已生成:
public int hashCode()
{
return pattern.hashCode();
// just enough fields for a reasonable distribution
}
这意味着,如果您创建多个具有相同模式
的SimpleDateFormat
实例(就像您的情况一样),它们将具有相同的hashCode
,因此toString()
将为这些实例返回相同的值。
此外,正如 rixmath 所发现的那样,具有相同 pattern
的 SimpleDateFormat
实例也将是相等的。
关于java - 新的 SimpleDateFormat 始终为给定的 dateFormat 返回相同的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46138451/