<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1573字,需瀏覽 4分鐘

           ·

          2022-01-10 02:11

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


          閱讀本文大概需要 2.8 分鐘。

          來自:blog.csdn.net/iblade/article/details/80749148/

          對象創(chuàng)建的幾種方法:
          1. 使用new關(guān)鍵字
          2. 使用clone方法
          3. 反射機(jī)制
          4. 反序列化
          以上四種都可以產(chǎn)生java對象
          • 1,3都會(huì)明確的顯式的調(diào)用構(gòu)造函數(shù)
          • 2是在內(nèi)存上對已有對象的影印 所以不會(huì)調(diào)用構(gòu)造函數(shù)
          • 4是從文件中還原類的對象 也不會(huì)調(diào)用構(gòu)造函數(shù)

          何為clone()?

          1. 拷貝對象返回的是一個(gè)新的對象,而不是一個(gè)對象的引用地址;
          2. 拷貝對象已經(jīng)包含原來對象的信息,而不是對象的初始信息,即每次拷貝動(dòng)作不是針對一個(gè)全新對象的創(chuàng)建。
          推薦下自己做的 Spring Boot 的實(shí)戰(zhàn)項(xiàng)目:
          https://github.com/YunaiV/ruoyi-vue-pro

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

          利用clone,在內(nèi)存中進(jìn)行數(shù)據(jù)塊的拷貝,復(fù)制已有的對象,也是生成對象的一種方式。前提是類實(shí)現(xiàn)Cloneable接口,Cloneable接口沒有任何方法,是一個(gè)空接口,也可以稱這樣的接口為標(biāo)志接口,只有實(shí)現(xiàn)了該接口,才會(huì)支持clone操作。有的人也許會(huì)問了,java中的對象都有一個(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ù)制對象的時(shí)候,會(huì)檢查對象的類是否實(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ù)制操作得到對象不需要調(diào)用構(gòu)造函數(shù),只是內(nèi)存中的數(shù)據(jù)塊的拷貝,那是不是拷貝對象的效率是不是一定會(huì)比new的時(shí)候的快。
          答案:不是。顯然jvm的開發(fā)者也意識(shí)到通過new方式來生成對象占據(jù)了開發(fā)者生成對象的絕大部分,所以對于利用new操作生成對象進(jìn)行了優(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?????????????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,其他不變再看打印

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

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

          推薦閱讀:

          讓手機(jī)1秒打開健康碼 ,任何機(jī)型!

          SpringBoot 定時(shí)任務(wù)動(dòng)態(tài)管理通用解決方案

          互聯(lián)網(wǎng)初中高級大廠面試題(9個(gè)G)

          內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper、數(shù)據(jù)結(jié)構(gòu)、限流熔斷降級......等技術(shù)棧!

          ?戳閱讀原文領(lǐng)取!? ? ? ? ? ? ? ??? ??? ? ? ? ? ? ? ? ? ?朕已閱?

          瀏覽 64
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费观看a网站 | 七区九区一区在线 | 天天干夜夜夜 | 99国产精品麻豆 | 男生女生操逼国产激情AV国产 |