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

对象创建的几种方法:

  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。

到此这篇关于Java 中的 clone( ) 和 new哪个效率更高的文章就介绍到这了,更多相关Java clone( ) 和 new内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅析Java中clone()方法浅克隆与深度克隆

    现在Clone已经不是一个新鲜词语了,伴随着"多莉"的产生这个词语确实很"火"过一阵子,在Java中也有这么一个概念,它可以让我们很方便的"制造"出一个对象的副本来,下面来具体看看Java中的Clone机制是如何工作的?      1. Clone&Copy 假设现在有一个Employee对象,Employee tobby =new Employee("CMTobby",5000),通 常我们会有这样的赋值Employ

  • 浅析Java中的 new 关键字

    java的new关键字想必大家都知道这是实例化一个对象.没错,也是为新对象分配内存空间. 比如new MyDate(22,7,1964)这样一个案例,他的完成需要四部: 一.为新对象分配内存空间,将MyDate存储到堆. 二.执行显示的初始化 三.执行构造器.new方法中括号参数传递给构造器,出书话该对象数值 四.该变量被赋值为堆内存中新对象的引用 通俗的说,你new的操作,实际上是在内存的堆中新添加一个new的对象并且通过构造方法初始化这个新对象并且在栈中存放该对象的引用 下面我有一个案例,通

  • 深入理解Java new String()方法

    问题一:这段代码创建了几个对象? String str1 = new String("aa"); 答案是两个 "aa"对象和String对象 其中有一项是常量池 常量池在Class文件被加载的时候,会被加载进内存中的方法区中的运行时常量池,而运行时常量池里就包括字符串常量池,Class文件中的字符串在类加载时就会加载到字符串常量池中去 不过在周志明老师在深入java虚拟机中有说到,到了JDK1.7时,字符串常量池就被移出了方法区,转移到了堆里了. String st

  • Java Class.forName()用法和newInstance()方法原理解析

    Class.forName()主要功能 Class.forName(xxx.xx.xx)返回的是一个类, Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段. 下面,通过解答以下三个问题的来详细讲解下Class.forName()的用法. ①new 和Class.forName()有什么区别和newInstance的用法? A a = (A)Class.forName("pacage.A").newInstance

  • Java中的clone()和Cloneable接口实例

    目录 clone()和Cloneable接口 Cloneable和clone()的总结 1.Cloneable 的用途 2.克隆的分类 3.克隆的举例 4.浅克隆的举例 5.深克隆的举例 clone()和Cloneable接口 clone顾名思义就是克隆,即,复制一个相等的对象,但是不同的引用地址. 我们知道拿到一个对象的地址,只要提供相应的方法就可以修改这个对象,但是如果我们想要得到这个对象去修改它,又想保留这个对象原来的属性,这是就可以使用clone(),它会复制一个内容相同的对象而具有不同

  • java 中clone()的使用方法

    java 中clone()的使用方法 前言: clone就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有: 1 使用new操作符创建一个对象 2 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存.程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间.分配完内存之后,

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

    对象创建的几种方法: 使用new关键字 使用clone方法 反射机制 反序列化 以上四种都可以产生java对象 1,3都会明确的显式的调用构造函数 2是在内存上对已有对象的影印 所以不会调用构造函数 4是从文件中还原类的对象 也不会调用构造函数 何为clone()? 拷贝对象返回的是一个新的对象,而不是一个对象的引用地址: 拷贝对象已经包含原来对象的信息,而不是对象的初始信息,即每次拷贝动作不是针对一个全新对象的创建. clone()和new那个更快? 利用clone,在内存中进行数据块的拷贝,

  • Java中的clone方法实例详解

    Java中对象创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有几种方式可以创建对象呢? 1 使用new操作符创建一个对象 2 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存.程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间.分配完内存之

  • Java中List集合去重方法以及效率对比

    List集合相信大家在开发过程中几乎都会用到.有时候难免会遇到集合里的数据是重复的,需要进行去除.然而,去重方式有好几种方式,你用的是哪种方式呢?去重方式效率是否是最高效.最优的呢?今天就给大家讲解一下List集合去重的常见及常用的四种方式. 01 实现思路:使用两个for循环遍历集合所有元素,然后进行判断是否有相同元素,如果有,则去除.这种方式是大部分最先想到的,也是最简单的实现方式.其中,这种方式可以保证List集合原来的顺序不变. 代码实现: /** * notes:使用两个for循环实现

  • Spring AOP中的JDK和CGLib动态代理哪个效率更高?

    一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理,另一种是CGLib的方式. 自Java 1.3以后,Java提供了动态代理技术,允许开发者在运行期创建接口的代理实例,后来这项技术被用到了Spring的很多地方. JDK动态代理主要涉及java.lang.reflect包下边的两个类:Proxy和InvocationHandler.其中,Invoc

  • Java中List常用操作比for循环更优雅的写法示例

    目录 引言 简单遍历 筛选符合某属性条件的List集合 获取某属性返回新的List集合 获取以某属性为key,其他属性或者对应对象为value的Map集合 以某个属性进行分组的Map集合 其他情况 总结 引言 使用JDK1.8之后,大部分list的操作都可以使用lambda表达式去写,可以让代码更简洁,开发更迅速.以下是我在工作中常用的lambda表达式对list的常用操作,喜欢建议收藏. 以用户表为例,用户实体代码如下: public class User { private Integer

  • PHP 字符串长度判断效率更高的方法

    有经验的程序员发现,php判断字符串长度,使用isset()在速度上比strlen()更快,执行效率更高.即: 复制代码 代码如下: $str = 'aaaaaa';if(strlen($str) > 6)VSif(!isset($str{6}) 用例子简单测试下,情况基本属实,isset()效率几乎是strlen()的3倍.示例: 复制代码 代码如下: <?php //使用strlen方式 $arr = "123456"; $sTime = microtime(1); i

  • 探讨++i与i++哪个效率更高

    答案: 在内建数据类型的情况下,效率没有区别: 在自定义数据类型的情况下,++i效率更高! 分析: (自定义数据类型的情况下) ++i返回对象的引用: i++总是要创建一个临时对象,在退出函数时还要销毁它,而且返回临时对象的值时还会调用其拷贝构造函数. (重载这两个运算符如下) 复制代码 代码如下: #include <iostream>using namespace std; class MyInterger{public:    long m_data;public:    MyInter

  • Java中的clone方法详解_动力节点Java学院整理

    Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有几种方式可以创建对象呢? 1 使用new操作符创建一个对象 2 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存.程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间.分配完内存

  • 浅析PHP的静态成员函数效率更高的原因

    很多php开发人员都知道, 使用类的静态成员函数效率比类的普通成员函数的要高,本文从应用层次分析这个问题 下面是一个范例: 复制代码 代码如下: <?php // php静态方法测试header('Content-Type: text/html; charset=utf-8');class xclass{     public static $var1 = '1111111111111111';     public $var2 = 'aaaaaaaaaaaaa';     public fun

随机推荐