SimpleDateFormat
SimpleDateFormat是一个性能十分低下的工具类,滥用SimpleDateFormat十分容易导致性能问题
错误的示范:
1 2 |
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = sdf.format(new Date()); |
错误的解决办法
如果将SimpleDateFormat写成static的,就可以避免重复创建,但是SimpleDateFormat又是线程不安全的,如果将其设成synchronized,性能又变差了
优雅的解决办法
比较优雅的做法是用ThreadLocal
网上的例子大多只支持一种格式
支持任意种格式的DateUtil
我稍加修改,现在多了一个format
参数,具体代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; public class DateUtil { private static Map<String, ThreadLocal<SimpleDateFormat>> threadMap = new HashMap<String, ThreadLocal<SimpleDateFormat>>(); private static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss"; public static Date parse(String dateString) throws ParseException { return parse(dateString, DEFAULT_FORMAT); } public static Date parse(String dateString, String format) throws ParseException { return getSdf(format).parse(dateString); } public static String format(Date date) { return format(date, DEFAULT_FORMAT); } public static String format(Date date, String format) { return getSdf(format).format(date); } private static SimpleDateFormat getSdf(final String format) { ThreadLocal<SimpleDateFormat> sdfLocal = threadMap.get(format); if (sdfLocal == null) { sdfLocal = new ThreadLocal<SimpleDateFormat>() { @Override protected synchronized SimpleDateFormat initialValue() { return new SimpleDateFormat(format); } }; } return sdfLocal.get(); } } |