我正在研究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,只是在必要时添加了一个模式。
答案 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)
SimpleDateFormat
类是旧的麻烦的日期时间类的一部分,这些类与最早的Java版本捆绑在一起,不再使用。现在遗留下来,它们完全被java.time类所取代。
请改用DateTimeFormatter
。
旧版日期时间类不 thread-safe。如果您的应用程序使用线程,或者将来可能使用线程,那么您不应传递SimpleDateFormat
的实例以供重用。
相比之下,java.time类使用不可变对象并且是线程安全的。您确实可以保留DateTimeFormatter
来传递和重用。
你似乎陷入了被称为premature optimization的陷阱。众所周知,程序员无法预测其应用程序的性能。当其他被忽略的代码阻塞时,预期的瓶颈通常会顺利运行。现代硬件和操作系统使性能更加难以预测。
今天的JVM实现经过高度调整,可能是历史上调整最多的软件。相信他们可以很好地运行您的代码。
除了一些基础知识,例如在经常运行的大型循环中避免不必要的实例化和网络连接,不要担心性能。而是使用profiling tools,monitoring tools和一些logging来确定和衡量应用的实际效果,以确定合法的性能问题。