微信公众号:51码农网
专业编程问答社区
www.51manong.com

Calendar.getInstance()是非常耗时的操作。需要明确的是,日历实际上不是单例。每次调用Calendar.getInstance()都会返回一个新对象。

查看源码:

public static Calendar getInstance()    {        Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));        cal.sharedZone = true;        return cal;    }

再看createCalendar方法

    private static Calendar createCalendar(TimeZone zone,                                           Locale aLocale)    {        Calendar cal = null;        String caltype = aLocale.getUnicodeLocaleType("ca");        if (caltype == null) {            // Calendar type is not specified.            // If the specified locale is a Thai locale,            // returns a BuddhistCalendar instance.            if ("th".equals(aLocale.getLanguage())                    && ("TH".equals(aLocale.getCountry()))) {                cal = new BuddhistCalendar(zone, aLocale);            } else {                cal = new GregorianCalendar(zone, aLocale);            }        } else if (caltype.equals("japanese")) {            cal = new JapaneseImperialCalendar(zone, aLocale);        } else if (caltype.equals("buddhist")) {            cal = new BuddhistCalendar(zone, aLocale);        } else {            // Unsupported calendar type.            // Use Gregorian calendar as a fallback.            cal = new GregorianCalendar(zone, aLocale);        }        return cal;    }

代码中可以清楚的看到是每次都创建的。

看看使用System.currentTimeMillis()和Calendar.getInstance()的性能差别

public class Test1 {   public static void main(String[] args) {       int runs = 10000;         long start = System.nanoTime();         Calendar cal = null;         for(int i=0;i<runs;i++)             cal = Calendar.getInstance();         long time = System.nanoTime() - start;         System.out.println("Calendar.getInstance() took on average "+time/runs+" ns. "+cal);         long start2 = System.nanoTime();         long now = 0;         for(int i=0;i<runs;i++)             now = System.currentTimeMillis();         long time2 = System.nanoTime() - start2;         System.out.println("System.currentTimeMillis() took on average "+time2/runs+" ns. "+now);  }

结果:

Calendar.getInstance() took on average 29348 ns. java.util.GregorianCalendar[time=1569646753165,.......]System.currentTimeMillis() took on average 89 ns. 1569646753167

微信公众号:51码农网