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方式。
文章参考