java new 和 clone 的效率比较

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java new 和 clone 的效率比较相关的知识,希望对你有一定的参考价值。

对于生成新的对象,我们常常用new,但是new看起来不是那么的快速,好像是个很费资源的操作,而clone看起来比new要好的多,来程序对比一下:

首先建立一个测试类,对此类进行new和clone操作,Test1.java:

public class Test1 implements Cloneable{
    String str;
    public Test1(String str){
        
        this.str=str;
    }
    public Test1 clone() throws CloneNotSupportedException{
        return (Test1)super.clone();
    }
}

主程序启动测试:分别进行10000000次new和clone,查看所用时间:

public class CloneTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        long t1=System.currentTimeMillis();
        for(int i=0;i<10000000;i++){
            Test1 s1= new Test1("test");
        }
        long t2=System.currentTimeMillis();
        Test1 s1=new Test1("test");
        for(int j=0;j<10000000;j++){
            
            Test1 s2=s1.clone();
        }
        long t3=System.currentTimeMillis();
        
        System.out.println(t2-t1);
        System.out.println(t3-t2);
    }
}

结果:

技术分享

可以看出,对于此类操作,new要比clone省时10倍左右,但是对于稍微复杂一点的对象呢?我们在Test1.java的构造方法里增加一些操作:修改后

public class Test1 implements Cloneable{
    String str;
    public Test1(String str){
        if(str.startsWith("r")){
            str="aaaaaaa";
        }
        str.replaceAll("es", "aa");
        this.str=str;
    }
    public Test1 clone() throws CloneNotSupportedException{
        return (Test1)super.clone();
    }
}

再次运行:结果:

技术分享

可以看出这里的new操作耗费了很长的时间,可以说是差距非常大,所以得出结论,对于轻量型对象,new更好,对于构造方法有些逻辑操作的对象,合理的使用clone能提升性能。

需要注意的是clone操作只是一个浅克隆,只会对克隆对象的变量值进行克隆,而不会对变量值指向的对象进行克隆,所以克隆有风险,操作需谨慎

以上是关于java new 和 clone 的效率比较的主要内容,如果未能解决你的问题,请参考以下文章

Java 中的 clone( ) 和 new,哪个效率更高?

PHP中的clone和new性能比较

java设计模式 GOF23 04 原型模式

Java数组赋值效率比较问题

四中copy数组方法的效率比较

Java克隆(Clone)的应用