我试图通过跨多个线程使用 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
nor DateFormat
(SimpleDateFormat
超类)也不Format
(DateFormat
超类)有一个toString()
实施,因此toString()
来自Object
实际执行的是class,其代码为:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Now, SimpleDateFormat
生成哈希码:
public int hashCode()
{
return pattern.hashCode();
// just enough fields for a reasonable distribution
}
这意味着如果您创建大量SimpleDateFormat
具有相同的实例pattern
,就像你的情况一样,他们会有相同hashCode
因此toString()
对于这些实例将返回相同的值。
此外,正如 Rixmath 发现的那样,SimpleDateFormat
具有相同的实例pattern
也将是平等的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)