我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

这篇文章主要介绍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));    }}

打印结果:

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

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();    }}

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

结论:轻量级的对象可以使用new,其他对象可以使用clone。

以上是“Java中clone( ) 和 new效率更高的是哪个”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这篇文章主要介绍Java中clone( ) 和 new效率更高的是哪个,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!对象创建的几种方法:使用new关键字使用clone方法反射机制反序列化以上四种都可以产生java对象
2023-06-21

Linux大文件重定向和管道的效率哪个更高

这篇文章主要讲解了“Linux大文件重定向和管道的效率哪个更高”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux大文件重定向和管道的效率哪个更高”吧!# 命令1,管道导入 shell>
2023-06-16

Python中的字符串查找和替换效率最高的方法是哪个?

Python中的字符串查找和替换效率最高的方法是哪个?在Python中,字符串是常用的数据类型之一,我们经常需要对字符串进行查找和替换操作。那么,在进行字符串查找和替换时,有哪些方法是效率最高的呢?本文将为你介绍Python中字符串查找和替
2023-10-22

比较Golang和Python的性能:哪个更高效?

Golang和Python的性能对比:谁更胜一筹?随着软件开发行业的迅猛发展,选择一种既高效又适用的编程语言变得尤为重要。本文将探讨两种流行的编程语言——Golang和Python的性能对比,旨在帮助读者了解两者在不同方面的优势,以便在需
比较Golang和Python的性能:哪个更高效?
2024-01-20

10个提高效率的UNIX和Linux技巧分别是什么

这期内容当中小编将会给大家带来有关10个提高效率的UNIX和Linux技巧分别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。如果您的服务也部署在 Linux 机器上,并且您每天有大量的时间花费在UN
2023-06-28

Java架构师与开发者提高效率的10个工具分别是哪些

Java架构师与开发者提高效率的10个工具分别是哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java 受到全球百万计开发者的追捧,已经演变为一门出色的编程语言。最终,
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录