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

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

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

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

image.png

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

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

源码使用clone去创建Calendar对象.png

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方式。

但要注意实现clone()方法的深浅拷贝问题。

文章参考

Java中clone( )和new效率比较

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容