物件創建的幾種方法:
- 使用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,
來源:blog.csdn.net/iblade/article/details/80749148
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2021最新版)
2.別在再滿屏的 if/ else 了,試試策略模式,真香!!
3.臥槽!Java 中的 xx ≠ null 是什么新語法?
4.Spring Boot 2.6 正式發布,一大波新特性,,
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/375115.html
標籤:Java
上一篇:從零構建Java專案(Maven+SpringBoot+Git) #02 奧斯丁專案
下一篇:MQ之RocketMQ專業術語
