1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 1547字,需瀏覽 4分鐘

         ·

        2021-12-13 03:26

        點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

        優(yōu)質(zhì)文章,第一時(shí)間送達(dá)



        -? ? ?對(duì)象創(chuàng)建的幾種方法? ? -


        1.使用new關(guān)鍵字
        2.使用clone方法
        3.反射機(jī)制

        4.反序列化

        以上四種都可以產(chǎn)生java對(duì)象
        1,3都會(huì)明確的顯式的調(diào)用構(gòu)造函數(shù)
        2是在內(nèi)存上對(duì)已有對(duì)象的影印 所以不會(huì)調(diào)用構(gòu)造函數(shù)

        4是從文件中還原類的對(duì)象 也不會(huì)調(diào)用構(gòu)造函數(shù)



        -? ? ?何為clone()?? ? -

        1.拷貝對(duì)象返回的是一個(gè)新的對(duì)象,而不是一個(gè)對(duì)象的引用地址;

        2.拷貝對(duì)象已經(jīng)包含原來對(duì)象的信息,而不是對(duì)象的初始信息,即每次拷貝動(dòng)作不是針對(duì)一個(gè)全新對(duì)象的創(chuàng)建。



        -? ? ?clone()和new那個(gè)更快?? ? -

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

          Object中有一個(gè)clone方法,為什么還必須要實(shí)現(xiàn)Cloneable接口呢,這就是cloneable接口這個(gè)標(biāo)志接口的意義,只有實(shí)現(xiàn)了這個(gè)接口才能實(shí)現(xiàn)復(fù)制操作,因?yàn)閖vm在復(fù)制對(duì)象的時(shí)候,會(huì)檢查對(duì)象的類是否實(shí)現(xiàn)了Cloneable這個(gè)接口,如果沒有實(shí)現(xiàn),則會(huì)報(bào)CloneNotSupportedException異常。類似這樣的接口還有Serializable接口、RandomAccess接口等。還有值得一提的是在執(zhí)行clone操作的時(shí)候,不會(huì)調(diào)用構(gòu)造函數(shù)。還有clone操作還會(huì)面臨深拷貝和淺拷貝的問題。關(guān)于這方面的問題,網(wǎng)上有很多的相關(guān)知識(shí)了,不再累述了。由于通過復(fù)制操作得到對(duì)象不需要調(diào)用構(gòu)造函數(shù),只是內(nèi)存中的數(shù)據(jù)塊的拷貝,那是不是拷貝對(duì)象的效率是不是一定會(huì)比new的時(shí)候的快。

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

        例如:

        package?com.miivii.javalib;
        ?
        /**
        ?*?Created?by?ylWang?on?2018/6/20?16:36.
        ?*/
        ?
        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?????????????Bean?bean?=?new?Bean("ylWang");
        ????????}
        ?
        ????????long?s2?=?System.currentTimeMillis();
        ?
        ????????Bean?bean?=?new?Bean("ylWang");
        ????????for?(int?i?=?0;?i?????????????Bean?b?=?bean.clone();
        ????????}
        ?
        ????????long?s3?=?System.currentTimeMillis();
        ?
        ????????System.out.println("new??=?"?+?(s2?-?s1));
        ????????System.out.println("clone?=?"?+?(s3?-?s2));
        ????}
        }

        打印結(jié)果:


        new完勝clone,真的是這樣嗎?

        下面在構(gòu)造函數(shù)里做點(diǎn)簡單的事情,例如字符串截取試試。只是修改Bean,其他不變?cè)倏创蛴?/span>

        package?com.miivii.javalib;
        ?
        /**
        ?*?Created?by?ylWang?on?2018/6/20?16:36.
        ?*/
        ?
        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();
        ????}
        }


        結(jié)論:輕量級(jí)的對(duì)象可以使用new,其他對(duì)象可以使用clone。


        ? 作者?|??iblade

        來源 |??csdn.net/iblade/article/details/80749148


        加鋒哥微信:?java1239??
        圍觀鋒哥朋友圈,每天推送Java干貨!

        瀏覽 61
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            我和二个女人做爰 | 拍戏被cao翻了h傅年 | 亚洲欧美日韩在线不卡 | 啊┅┅快┅┅用力啊黄蓉武三通 | 性爱av在线观看 青娱乐亚洲精品 | 老熟女 露脸 嗷嗷叫91 | 免费成人片在线观看 | 午夜精品视频一区 | 99精品久久久久久中文字幕 | 亚洲色播免费视频 |