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

标签 java


我试图通过跨多个线程使用 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编译/运行时是否进行此优化?任何指示都会有帮助

最佳答案

SimpleDateFormatDateFormat (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 所发现的那样,具有相同 patternSimpleDateFormat 实例也将是相等的。

关于java - 新的 SimpleDateFormat 始终为给定的 dateFormat 返回相同的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46138451/

相关文章:

java - 奇数/偶数程序不打印任何内容

java - 如何使用 Gitlab CI 构建 Java Maven 项目?

java - 用于将 Java 类型映射到 Cassandra 类型的 DataStax API

java - 我可以使用代码来控制 Spring Boot 中 ApplicationContext 做出的依赖解析决策吗?

java - 在类之间发送变量

java - Android Studio,如何将 fragment 添加到我的选项卡菜单?

java - 如何插入模板来使用intellij idea编写代码

java - 使用 Swing 组件创建一个精美的搜索栏

java - 关于java中==运算符的问题

java - java spring boot 中的 Autowiring beans.groovy