欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年12月07日 09:57:15   作者:Java技術棧  
很多朋友不太清楚clone()和new那個更快?針對這個問題我百度了好多資料,最終小編總結下關于Java?中的?clone(?)?和?new哪個效率更高的問題,感興趣的朋友跟隨小編一起看看吧

對象創(chuàng)建的幾種方法:

  1. 使用new關鍵字
  2. 使用clone方法
  3. 反射機制
  4. 反序列化

以上四種都可以產(chǎn)生java對象

  • 1,3都會明確的顯式的調用構造函數(shù)
  • 2是在內(nèi)存上對已有對象的影印 所以不會調用構造函數(shù)
  • 4是從文件中還原類的對象 也不會調用構造函數(shù)

何為clone()?

  1. 拷貝對象返回的是一個新的對象,而不是一個對象的引用地址;
  2. 拷貝對象已經(jīng)包含原來對象的信息,而不是對象的初始信息,即每次拷貝動作不是針對一個全新對象的創(chuàng)建。

clone()和new那個更快?

利用clone,在內(nèi)存中進行數(shù)據(jù)塊的拷貝,復制已有的對象,也是生成對象的一種方式。前提是類實現(xiàn)Cloneable接口,Cloneable接口沒有任何方法,是一個空接口,也可以稱這樣的接口為標志接口,只有實現(xiàn)了該接口,才會支持clone操作。有的人也許會問了,java中的對象都有一個默認的父類Object。

Object中有一個clone方法,為什么還必須要實現(xiàn)Cloneable接口呢,這就是cloneable接口這個標志接口的意義,只有實現(xiàn)了這個接口才能實現(xiàn)復制操作,因為jvm在復制對象的時候,會檢查對象的類是否實現(xiàn)了Cloneable這個接口,如果沒有實現(xiàn),則會報CloneNotSupportedException異常。類似這樣的接口還有Serializable接口、RandomAccess接口等。

還有值得一提的是在執(zhí)行clone操作的時候,不會調用構造函數(shù)。還有clone操作還會面臨深拷貝和淺拷貝的問題。關于這方面的問題,網(wǎng)上有很多的相關知識了,不再累述了。由于通過復制操作得到對象不需要調用構造函數(shù),只是內(nèi)存中的數(shù)據(jù)塊的拷貝,那是不是拷貝對象的效率是不是一定會比new的時候的快。

答案:不是。顯然jvm的開發(fā)者也意識到通過new方式來生成對象占據(jù)了開發(fā)者生成對象的絕大部分,所以對于利用new操作生成對象進行了優(yōu)化。

例如:

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,真的是這樣嗎?

下面在構造函數(shù)里做點簡單的事情,例如字符串截取試試。只是修改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內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Intellij IDEA調試技巧的深入講解

    Intellij IDEA調試技巧的深入講解

    這篇文章主要給大家介紹了關于Intellij IDEA調試技巧的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • MyBatis-Plus多數(shù)據(jù)源的示例代碼

    MyBatis-Plus多數(shù)據(jù)源的示例代碼

    本文主要介紹了MyBatis-Plus多數(shù)據(jù)源的示例代碼,包括依賴配置、數(shù)據(jù)源配置、Mapper 和 Service 的定義,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • 詳解Java程序啟動時-D指定參數(shù)是什么

    詳解Java程序啟動時-D指定參數(shù)是什么

    java服務啟動的時候,都會指定一些參數(shù),下面這篇文章主要給大家介紹了關于Java程序啟動時-D指定參數(shù)是什么的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • RocketMq 消息重試機制及死信隊列詳解

    RocketMq 消息重試機制及死信隊列詳解

    這篇文章主要為大家介紹了RocketMq 消息重試機制及死信隊列詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • java語言中封裝類代碼示例

    java語言中封裝類代碼示例

    這篇文章主要介紹了java語言中封裝類,涉及相關代碼示例及結果分析,以及封裝的好處簡單介紹,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • mybatisplus?復合主鍵(多主鍵)?CRUD示例詳解

    mybatisplus?復合主鍵(多主鍵)?CRUD示例詳解

    這篇文章主要介紹了mybatisplus?復合主鍵(多主鍵)?CRUD實例詳解,本文通過實例代碼圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • 基于Spring實現(xiàn)零重啟自由編排任務的定時管理器

    基于Spring實現(xiàn)零重啟自由編排任務的定時管理器

    我們發(fā)現(xiàn),我們使用Spring自帶的定時任務如果要有修改,那么就要修改代碼,然后重啟項目,所以本文就帶大家實現(xiàn)一個零重啟自由編排任務的定時管理器吧
    2023-07-07
  • Java收集的雪花算法代碼詳解

    Java收集的雪花算法代碼詳解

    這篇文章主要介紹了Java實現(xiàn)雪花算法的詳細代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-10-10
  • MyBatis Plus關閉SQL日志打印的方法

    MyBatis Plus關閉SQL日志打印的方法

    這篇文章主要介紹了MyBatis-Plus如何關閉SQL日志打印,文中通過圖文結合講解的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2024-02-02
  • 淺析Spring工廠的反射和配置文件

    淺析Spring工廠的反射和配置文件

    這篇文章主要介紹了淺析Spring工廠的反射和配置文件,spring是通過反射和配置文件的方式來獲取 JavaBean 對象,需要的朋友可以參考下
    2023-04-04

最新評論