【Java】標記介面

TypantK發表於2019-03-21

Clonable介面

第一次見到還是Clonable介面,為什麼會沒有方法?

那實現了有什麼用?

可以看註釋的這一句話

 * A class implements the <code>Cloneable</code> interface to
 * indicate(表明) to the {@link java.lang.Object#clone()} method that it
 * is legal for that method to make a
 * field-for-field copy of instances of that class.

實現了Cloneable介面的類,表明它可以合法的使用域之間的複製。

其實也就是實現了Cloneable介面,才有能力使用Clone()方法,而Object類裡面本身就有宣告Clone()方法,所以Clonable介面就不用再宣告瞭。

 

這就是所謂的標記介面

這些介面沒有任何的方法,實現此介面的類,才可以合法的使用某些功能

 

Serializable介面

這個介面是用來標記類是否支援序列化的,所謂的序列化就是將物件的各種資訊轉換成可以儲存或者傳輸的一種形式

這也就是為什麼使用位元組流深拷貝物件要實現序列化介面了,這樣才能通過流傳輸物件資訊。

如果一個類沒有實現該介面,卻被拿去序列化的了,那麼虛擬機器就會丟擲不支援序列化的異常,同Clonable。

 

 

RandomAccess介面

這個介面的作用是判斷集合是否能快速訪問,也就是通過索引下標能否快速的移動到對應的元素上。我們在使用某個集合類中,集合中的元素可以通過索引index下標快速的訪問到,那麼在該類的定義處,一般會有一個RandomAccess介面的實現標籤

判斷了之後,才能根據不同集合的性質來使用不同的方法。

比如ArrayList 和 LinkedList 同時使用方法Collections.binarySearch()


由此可以看出,判斷list是否實現RandomAccess介面來實行indexedBinarySerach(list,key)或iteratorBinarySerach(list,key)方法。ps(instanceof其作用是用來判斷某物件是否為某個類或介面型別)

那麼,又有人疑問,執行這兩個方法有什麼不同?

檢視下indexedBinarySerach(list,key)方法原始碼:

-------------------------------------------------------------------------------------------------------------

檢視下iteratorBinarySerach(list,key)方法原始碼:

通過檢視原始碼,發現實現RandomAccess介面的List集合採用一般的for迴圈遍歷,而未實現這介面則採用迭代器。

接下來,我們將進行下測試ArrayList以及LinkedList採用這兩種方法各自的效能是如何!

-------------------------------------------------------------------------------------------------------------

main方法:

-------------------------------------------------------------------------------------------------------------


for迴圈遍歷ArrayList

-------------------------------------------------------------------------------------------------------------

iterator迭代器遍歷ArrayList

-------------------------------------------------------------------------------------------------------------
for迴圈遍歷LinkedList

-------------------------------------------------------------------------------------------------------------

iterator迭代器遍歷LinkedList


-------------------------------------------------------------------------------------------------------------
執行結果:

從上面資料可以看出,

ArrayList用for迴圈遍歷比iterator迭代器遍歷快,LinkedList用iterator迭代器遍歷比for迴圈遍歷快

所以說,當我們在做專案時,應該考慮到List集合的不同子類採用不同的遍歷方式,能夠提高效能
--------------------- 
作者:DriveMan 
來源:CSDN 
原文:https://blog.csdn.net/weixin_39148512/article/details/79234817 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

 

 

 

 

 

相關文章