Java中clone( )和new效率哪個更高?
點擊關注公眾號,Java干貨及時送達??

來源:blog.csdn.net/iblade/article/details/80749148/
對象創(chuàng)建的幾種方法:
使用new關鍵字 使用clone方法 反射機制 反序列化
以上四種都可以產生java對象
1,3都會明確的顯式的調用構造函數 2是在內存上對已有對象的影印 所以不會調用構造函數 4是從文件中還原類的對象 也不會調用構造函數
何為clone()?
拷貝對象返回的是一個新的對象,而不是一個對象的引用地址; 拷貝對象已經包含原來對象的信息,而不是對象的初始信息,即每次拷貝動作不是針對一個全新對象的創(chuàng)建。
clone()和new那個更快?
利用clone,在內存中進行數據塊的拷貝,復制已有的對象,也是生成對象的一種方式。前提是類實現(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操作的時候,不會調用構造函數。還有clone操作還會面臨深拷貝和淺拷貝的問題。關于這方面的問題,網上有很多的相關知識了,不再累述了。由于通過復制操作得到對象不需要調用構造函數,只是內存中的數據塊的拷貝,那是不是拷貝對象的效率是不是一定會比new的時候的快。
答案:不是。顯然jvm的開發(fā)者也意識到通過new方式來生成對象占據了開發(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?????????????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));
????}
}
打印結果:

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。
2.?手把手10分鐘實現(xiàn) Spring Boot 發(fā)送郵件功能
最近面試BAT,整理一份面試資料《Java面試BATJ通關手冊》,覆蓋了Java核心技術、JVM、Java并發(fā)、SSM、微服務、數據庫、數據結構等等。
獲取方式:點“在看”,關注公眾號并回復?Java?領取,更多內容陸續(xù)奉上。
文章有幫助的話,在看,轉發(fā)吧。
謝謝支持喲 (*^__^*)

