0
点赞
收藏
分享

微信扫一扫

JAVA进阶篇(6)—Calendar日期类性能优化(clone创建Calendar对象)

JAVA && Spring && SpringBoot2.x — 学习目录

1. 源起:源码中使用clone去创建Calendar对象对象

com.fasterxml.jackson.databind.util.StdDateFormat中有这样一段描述。

这是Jackson的默认时间格式化策略的源码,Jackson目前应用广泛,该代码的性能与安全性还是有保障的。

因为GregorianCalendar不是线程安全的,故源码使用clone的方式去“更便捷”的创建Calendar对象。而不是在方法中单纯的new GregorianCalendar();

2. 测试:大量创建Calendar对象对比效率

    @Test
    public void testClone() {
        long t1 = System.currentTimeMillis();
        //借助数组保存(一定程度避免JVM优化)
        Calendar[] calendars1 = new Calendar[100000];
        Calendar[] calendars2 = new Calendar[100000];
        for (int i = 0; i < 100000; i++) {
            Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"), Locale.US);
            calendars1[i] = calendar;
        }
        long t2 = System.currentTimeMillis();
        for (int j = 0; j < 100000; j++) {
            Calendar clone = (Calendar) CALENDAR.clone();
            calendars2[j] = clone;
        }
        long t3 = System.currentTimeMillis();
        System.out.println(t2 - t1);
        System.out.println(t3 - t2);
    }

多次测试结果:clone创建效率比new GregorianCalendar()效率高。

3. 思考:clone和new的效率对比。

clone对象返回的是一个新的对象,而不是一个对象的引用地址;拷贝对象是拷贝对象已经存在的信息,而不是对象的初始信息。

3.1 clone()和new那个更快?

利用clone,在内存中进行数据块的拷贝,复制已有对象,也是生成对象的一种方式。前提是类要实现Cloneable接口。clone()得到的对象不需要调用构造函数,只是内存中的数据快的拷贝。那是否拷贝对象的效率一定比new的时候快呢?

答案:不是,显然jvm开发者也意识到通过new方式来生成对象占据开发者生成对象的绝大部分,所以对利用new操作生成对象的方式进行了优化。对于轻量级对象,new的效率比较高,但是对于复杂对象,clone的效率要远远高于new方式。

文章参考

Java中clone( )和new效率比较

举报

相关推荐

0 条评论