有一个测试类Student如下:
public class Student implements Cloneable {
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
测试代码demo:
import com.example.goodforjava.entity.Student;
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
long startTime = System.currentTimeMillis();
Student student = new Student();
//克隆循环十万次
for (int i = 0; i < 100000; i++) {
student.clone();
}
long midTime = System.currentTimeMillis();
System.out.println("克隆生成对象耗费的时间:" + (midTime - startTime) + "ms");
//new10万次
for (int i = 0; i < 100000; i++) {
new Student();
}
System.out.println("new生成对象耗费的时间:" + (System.currentTimeMillis() - midTime) + "ms");
}
}
运行结果如下:
从输出结果可以看出,同样是10万次,new生成对象的效率比克隆生成对象的效率比高了75%左右。
总结
大部分情况下使用new来生成对象是正确的决定,因为JVM对new做了相应的性能优化,不过如果构造函数的逻辑很复杂,此时通过new创建该对象会比较耗时,那么就可以尝试使用克隆来生成对象,但是使用克隆就得注意浅拷贝和深拷贝的问题了。