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
;
//獲取名字首字母
//java學習交流:737251827 進入可領取學習資源及對十年開發經驗大佬提問,免費解答!
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。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010294/viewspace-2845750/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python爬蟲和java爬蟲哪個效率高Python爬蟲Java
- Rust中的Copy和CloneRust
- 安全等保二級和三級哪個高?哪個費用更高?
- 2019年Python、Java、C++學哪個更好?薪資更高?PythonJavaC++
- 前端開發和後端開發,哪個薪酬更高?前端後端
- JavaScript中的new map()和new set()使用詳細(new map()和new set()的區別)JavaScript
- Java和Python哪個更好?JavaPython
- 理解new和實現一個new
- 老徐和阿珍的故事:ArrayList和LinkedList的效率到底哪個高?
- 如何知道 Git clone 時 GitHub 使用的是哪個 SSH key 呢Github
- Python和Java哪個好?分析!PythonJava
- 深度揭祕Netty中的FastThreadLocal為什麼比ThreadLocal效率更高?NettyASTthread
- Java新手學習路線,0基礎學習Java怎樣效率更高?Java
- Java和人工智慧哪個好?Java人工智慧
- java和python哪個更好用?(五)JavaPython
- 想要當程式設計師,前端和後端哪個工資更高呢?程式設計師前端後端
- 職場中哪些團隊協作準則,讓效率更高?
- Python和Java,你會選擇哪個?PythonJava
- 學程式設計,Python和Java哪個更好?程式設計PythonJava
- PHP new self()和new static()的區別PHP
- python中__init__ 和__new__的對比Python
- CSM敏捷實踐|如何讓團隊的迭代效率更高?敏捷
- Java執行緒池maximumPoolSize和workQueue哪個先飽和?Java執行緒
- python和Java哪個更適合web開發?PythonJavaWeb
- Python和Java該如何選擇?選哪個好?PythonJava
- Python和Java,哪個更適合web開發?PythonJavaWeb
- 在 .NET 中的 ConvertAll 和 Select 方法哪個效能好
- 【C++】C++ new和malloc到底哪裡不一樣C++
- 深入理解 Go 中的 new() 和 make() 函式Go函式
- 學習Java哪個好?選擇哪個版本Java
- 5.9java-newJava
- 在iOS中運用React Component的思路,效率更高的開發UI,更好的複用UI元件iOSReactUI元件
- Java和Golang到底哪個語言更簡單? - sivalabsJavaGolang
- Java和HTML有什麼區別?哪個更重要?JavaHTML
- Python和Java相比,開發效率如何?PythonJava
- PHP 的 new static 和 new self 具體有什麼?PHP
- StringBuider 在什麼條件下、如何使用效率更高?UIIDE
- 11 自從用了trello,時間更多,效率更高了