您好,登錄后才能下訂單哦!
這篇文章主要介紹Java中clone( ) 和 new效率更高的是哪個,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
對象創建的幾種方法:
使用new關鍵字
使用clone方法
反射機制
反序列化
以上四種都可以產生java對象
1,3都會明確的顯式的調用構造函數
2是在內存上對已有對象的影印 所以不會調用構造函數
4是從文件中還原類的對象 也不會調用構造函數
何為clone()?
拷貝對象返回的是一個新的對象,而不是一個對象的引用地址;
拷貝對象已經包含原來對象的信息,而不是對象的初始信息,即每次拷貝動作不是針對一個全新對象的創建。
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效率更高的是哪個”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。