新的SimpleDateFormat("模式")与applyPattern("模式")差异和性能优势(如果有的话)?

时间:2017-12-14 09:54:31

标签: java date simpledateformat

我正在研究Java 7中的代码,它使用了大量的日期转换为String和From string to Date对象,只要他们需要转换日期,他们就会为此创建新的SimpleDateFormat(" Pattern") (整体上有5-6种模式)。所以我需要问一下如果我写这样的代码怎么办:

private SimpleDateFormat simpleDateFormat = new SimpleDateFormat();

private SimpleDateFormat getsiSimpleDateFormat(SimpleDateFormat simpleDateFormat, String format){
    simpleDateFormat.applyPattern(format);
    return simpleDateFormat;
}

所以在这里我重用了我的simpleDateFormat,只是在必要时添加了一个模式。

  • 这种做法好吗?
  • 或者可以有更多改进?
  • 通过使用这种方法,我会面临处理或内存的增加吗?

2 个答案:

答案 0 :(得分:2)

这两者明显相同。查看代码,您可以看到使用基本构造函数导致:

public SimpleDateFormat(String pattern)
{ 
    this(pattern, Locale.getDefault(Locale.Category.FORMAT));
} 

this导致:

public SimpleDateFormat(String pattern, Locale locale)
{
    if (pattern == null || locale == null) {
        throw new NullPointerException();
    }

    initializeCalendar(locale);
    this.pattern = pattern; // This part is important
    this.formatData = DateFormatSymbols.getInstanceRef(locale);
    this.locale = locale;
    initialize(locale);
}

另一方面,使用applyPattern(pattern)会得到以下结果:

public void applyPattern(String pattern)
{
    compiledPattern = compile(pattern);
    this.pattern = pattern; // Same as initialization
}

正如Roby Cornelissen在评论中指出的那样,两种方法并不完全相同。 applyPattern假设您已初始化了SimpleDateFormat,但跳过了区域设置+日历初始化。 在性能和内存中,使用applyPattern比重新创建对象更好。前一个答案是:

  

随后只有一个区别:使用applyPattern将使用更少的内存,因为您只使用一个对象而不是重新初始化new SimpleDateFormat()。选择取决于你。

并且不完全正确(存在多个差异)。

修改

如果您有任何疑问,构造函数中的initialize()方法会编译模式,因此如果您给它一个错误的模式,则会抛出IllegalArgumentException。代码(我在这里首先发布)使它看起来不会崩溃。

答案 1 :(得分:2)

java.time

SimpleDateFormat类是旧的麻烦的日期时间类的一部分,这些类与最早的Java版本捆绑在一起,不再使用。现在遗留下来,它们完全被java.time类所取代。

请改用DateTimeFormatter

线程安全

旧版日期时间类 thread-safe。如果您的应用程序使用线程,或者将来可能使用线程,那么您不应传递SimpleDateFormat的实例以供重用。

相比之下,java.time类使用不可变对象并且是线程安全的。您确实可以保留DateTimeFormatter来传递和重用。

过早优化

你似乎陷入了被称为premature optimization的陷阱。众所周知,程序员无法预测其应用程序的性能。当其他被忽略的代码阻塞时,预期的瓶颈通常会顺利运行。现代硬件和操作系统使性能更加难以预测。

今天的JVM实现经过高度调整,可能是历史上调整最多的软件。相信他们可以很好地运行您的代码。

除了一些基础知识,例如在经常运行的大型循环中避免不必要的实例化和网络连接,不要担心性能。而是使用profiling toolsmonitoring tools和一些logging来确定和衡量应用的实际效果,以确定合法的性能问题。