我正在编写Java 7中的代码,它使用了从String到date对象的大量日期转换,每当他们需要转换日期时,他们就会为其创建新的SimpleDateFormat(“模式”)(总体上有5-6个模式)。所以我需要问一下,如果我写一些这样的代码会怎么样:
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
private SimpleDateFormat getsiSimpleDateFormat(SimpleDateFormat simpleDateFormat, String format){
simpleDateFormat.applyPattern(format);
return simpleDateFormat;
}因此,在这里,我将重用我的simpleDateFormat,并在任何必要的地方添加一个模式。
发布于 2017-12-14 10:08:48
这两件事显然是一样的。查看代码,您可以看到使用基本构造函数会导致:
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
}正如罗比·科尼尔森在评论中指出的那样,这两种方法并不完全相同。applyPattern假设您已经初始化了SimpleDateFormat,但跳过了locale +日历初始化。在性能和内存方面,使用applyPattern比重新创建对象更好。前一个答案是:
随后,只有一个不同之处:使用
applyPattern将使用较少的内存,因为您只使用一个对象而不是重新初始化new SimpleDateFormat()。选择由你来决定。
而且是不完全正确的(有一个以上的区别)。
编辑
如果您有任何疑问,构造函数中的initialize()方法会编译模式,因此如果您给出了错误的模式,就会抛出一个IllegalArgumentException。代码(我在这里发布的第一篇)使它看起来像不会崩溃。
发布于 2017-12-14 15:45:55
java.time
SimpleDateFormat类是与不再使用的最早版本的Java捆绑在一起的旧的麻烦日期时间类的一部分。现在,它们完全被java.time类所取代。
使用DateTimeFormatter代替。
螺纹安全
遗留日期-时间类不是螺纹安全。如果您的应用程序使用线程,或者将来可能使用,那么您不应该传递要重用的SimpleDateFormat实例。
相反,java.time类使用不可变对象,并且是线程安全的.您确实可以保留要传递和重用的DateTimeFormatter。
早熟优化
你好像掉进了一个叫做过早优化的陷阱里。众所周知,程序员不善于预测他们的应用程序的性能。预期的瓶颈通常运行平稳,而其他被忽略的代码阻塞。现代硬件和操作系统使得性能预测更加困难。
今天的JVM实现是高度调优的,很可能是历史上最调优的软件。相信他们会很好地运行你的代码。
除了避免频繁运行的大循环中的不必要的实例化和网络连接等一些基础知识之外,不要担心性能。相反,可以使用分析工具、监测工具和一些日志记录来确定和应用程序的实际性能,以确定合理的性能关注点。
https://stackoverflow.com/questions/47810405
复制相似问题