关于java:Java-中的-clone-和-new哪个效率更高

22次阅读

共计 2058 个字符,预计需要花费 6 分钟才能阅读完成。

对象创立的几种办法:

  1. 应用 new 关键字
  2. 应用 clone 办法
  3. 反射机制
  4. 反序列化

以上四种都能够产生 java 对象

  • 1,3 都会明确的显式的调用构造函数
  • 2 是在内存上对已有对象的影印 所以不会调用构造函数
  • 4 是从文件中还原类的对象 也不会调用构造函数

何为 clone()?

  1. 拷贝对象返回的是一个新的对象,而不是一个对象的援用地址;
  2. 拷贝对象曾经蕴含原来对象的信息,而不是对象的初始信息,即每次拷贝动作不是针对一个全新对象的创立。

clone()和 new 那个更快?

利用 clone,在内存中进行数据块的拷贝,复制已有的对象,也是生成对象的一种形式。前提是类实现 Cloneable 接口,Cloneable 接口没有任何办法,是一个空接口,也能够称这样的接口为标记接口,只有实现了该接口,才会反对 clone 操作。有的人兴许会问了,java 中的对象都有一个默认的父类 Object。

Object 中有一个 clone 办法,为什么还必须要实现 Cloneable 接口呢,这就是 cloneable 接口这个标记接口的意义,只有实现了这个接口能力实现复制操作,因为 jvm 在复制对象的时候,会查看对象的类是否实现了 Cloneable 这个接口,如果没有实现,则会报 CloneNotSupportedException 异样。相似这样的接口还有 Serializable 接口、RandomAccess 接口等。

还有值得一提的是在执行 clone 操作的时候,不会调用构造函数。还有 clone 操作还会面临深拷贝和浅拷贝的问题。对于这方面的问题,网上有很多的相干常识了,不再累述了。因为通过复制操作失去对象不须要调用构造函数,只是内存中的数据块的拷贝,那是不是拷贝对象的效率是不是肯定会比 new 的时候的快。

答案:不是。显然 jvm 的开发者也意识到通过 new 形式来生成对象占据了开发者生成对象的绝大部分,所以对于利用 new 操作生成对象进行了优化。

例如:

package com.miivii.javalib;

public class Bean implements Cloneable {
    private String name;

    public Bean(String name) {this.name = name;}

    @Override
    protected Bean clone() throws CloneNotSupportedException {return (Bean) super.clone();}
}
package com.miivii.javalib;

public class TestClass {
    private static final int COUNT = 10000 * 1000;

    public static void main(String[] args) throws CloneNotSupportedException {long s1 = System.currentTimeMillis();

        for (int i = 0; i < COUNT; i++) {Bean bean = new Bean("ylWang");
        }

        long s2 = System.currentTimeMillis();

        Bean bean = new Bean("ylWang");
        for (int i = 0; i < COUNT; i++) {Bean b = bean.clone();
        }

        long s3 = System.currentTimeMillis();

        System.out.println("new  =" + (s2 - s1));
        System.out.println("clone =" + (s3 - s2));
    }
}

打印后果:

new 完胜 clone,真的是这样吗?

上面在构造函数里做点简略的事件,例如字符串截取试试。只是批改 Bean, 其余不变再看打印

package com.miivii.javalib;

public class Bean implements Cloneable {
    private String name;
    private String firstSign;// 获取名字首字母

    public Bean(String name) {
        this.name = name;
        if (name.length() != 0) {firstSign = name.substring(0, 1);
            firstSign += "abc";
        }
    }

    @Override
    protected Bean clone() throws CloneNotSupportedException {return (Bean) super.clone();}
}

论断: 轻量级的对象能够应用 new,其余对象能够应用 clone。

起源:blog.csdn.net/iblade/article/details/80749148

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿 (2021 最新版)

2. 别在再满屏的 if/ else 了,试试策略模式,真香!!

3. 卧槽!Java 中的 xx ≠ null 是什么新语法?

4.Spring Boot 2.6 正式公布,一大波新个性。。

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

正文完
 0