新的 SimpleDateFormat 始终为给定的 dateFormat 返回相同的引用

2023-11-23


我试图通过跨多个线程使用 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(使用前将#替换为@)

新的 SimpleDateFormat 始终为给定的 dateFormat 返回相同的引用 的相关文章

随机推荐