克隆如何比对象创建具有更多性能

lfe*_*z93 8 java performance clone cloneable

我试图理解java中clone()方法下面发生了什么,我想知道如何做一个新的调用

public class Person implements Cloneable {

    private String firstName;
    private int id;
    private String lastName;

    //constructors, getters and setters

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person p = (Person) super.clone();
        return p;
    }

}
Run Code Online (Sandbox Code Playgroud)

这是我的克隆代码我想知道底下发生了什么,以及新呼叫之间有什么区别因为.

这是我的客户端代码

    Person p = new Person("John", 1, "Doe");
    Person p2 = null;
    try {
         p2 = (Person) p.clone();
    } catch (CloneNotSupportedException ex) {
        Logger.getLogger(clientPrototype.class.getName()).log(Level.SEVERE, null, ex);
    }
    p2.setFirstName("Jesus");
    System.out.println(p);
    System.out.println(p2);
Run Code Online (Sandbox Code Playgroud)

Gre*_*ren 6

如果需要副本,请调用clone(),否则请调用构造函数。
标准克隆方法(java.lang.Object.clone())在不调用构造函数的情况下创建对象的浅表副本。如果需要深层副本,则必须重写clone方法。
而且不用担心性能。
性能取决于克隆方法和构造函数的内容,而不取决于所使用的技术(新技术或克隆技术)本身。

编辑:克隆和构造函数不是真正地彼此替代,它们实现了不同的目的


And*_*mov 6

我为 class创建了简单的基准测试Person

public class Person {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
Run Code Online (Sandbox Code Playgroud)

并得到以下结果:

Benchmark             Mode  Cnt     Score       Error   Units

MyBenchmark.viaClone  avgt   10     10.041 ±    0.059   ns/op
MyBenchmark.viaNew    avgt   10      7.617 ±    0.113   ns/op
Run Code Online (Sandbox Code Playgroud)

这个简单的基准测试表明,从源对象实例化新对象并设置相应的属性比克隆它花费的时间少 25%。


小智 5

public void testPerformance(){
    SimpleDateFormat sdf  = new SimpleDateFormat("yyyy-MM-dd");
    long start = System.currentTimeMillis();
    for(int i = 0; i < 1000000; i++){
        SimpleDateFormat localSdf = (SimpleDateFormat)sdf.clone();
    }
    System.out.println("Cloning : " + (System.currentTimeMillis() - start) + " ms");

    start = System.currentTimeMillis();
    for(int i = 0; i < 1000000; i++){
        Object localSdf = new SimpleDateFormat("yyyy-MM-dd");
    }
    System.out.println("Creating : " + (System.currentTimeMillis() - start) + " ms");

}
Run Code Online (Sandbox Code Playgroud)

克隆:302毫秒创建:885毫秒

  • 用户想知道克隆功能的幕后情况,而不仅仅是性能。 (2认同)
  • 这不是关于对象克隆与构造函数的性能,而是关于 `SimpleDateFormat`,因为这个特定的构造函数非常繁重。我建议使用它的静态实例以供重用。 (2认同)