AbstractCollection原始碼分析

2021-03-31 08:56:29 字數 1514 閱讀 9114

abstractcollection抽象類提供了collection的骨架實現,collection分析請看:

這裡直接看它的**是如何實現的.

public abstract iterator iterator();

該方法沒有實現.

public abstract int size();

該方法沒有實現.

public boolean isempty()

非常簡單,直接呼叫size()方法返回大小,如果是0就認為是空集合.

你不會覺得奇怪吧,size()方法沒有實現,怎麼可以呼叫呢?因為這個是抽象類,不可以例項化的,具體的時候呼叫的是子類中的實現.

public boolean contains(object o) else

return false;

}**不複雜,也是呼叫自己的方法iterator,遍歷集合,如果找到了就返回true,在沒找到的情況下是要遍歷整個集合的.對於null值的情況一定要

放在if裡面,而不能放在else裡面.

public object toarray()

返回陣列,先生成乙個和集合一樣大小的陣列,然後通過遍歷賦值.

public object toarray(object a)

這個方法如果在陣列a比集合小的情況和上面是一樣的,這種情況下生成了乙個新的陣列,這裡用到了反射(從字面上就可以看出意思).為什麼不

可以直接new呢?因為陣列a中的元素是具有執行時型別的,而不僅僅是object.可以看出當a可以容納整個集合時是不用重新分配空間的,而且如果

a比集合大,會設定a[size]為null值,而且僅僅設定了這乙個.如果集合允許null值的話,通過返回陣列是無法判斷集合的大小的,因為可能集合的

最後幾個都是null值.

public boolean add(object o)

這個方法提供了實現,但是是直接丟擲乙個異常,和未實現的方法是有區別的,非抽象子類中可以不重寫這個方法,如果子類不想支援這個操作的

話,而未實現的方法子類必須實現,否則編譯同不過.

public boolean remove(object o)

}} else }}

return false;

}這個方法和contians方法基本一樣,多了一條e.remove語句而已.

public boolean containsall(collection c)

這個方法比較簡潔,但是時間複雜度是m*n,通過檢查沒乙個元素是否在集合中,如果發現乙個不在直接返回false.可以看出返回true的情況花的

時間比返回false要多.

public boolean addall(collection c)

return modified;

}這裡是通過乙個乙個加入集合的,同樣這裡的add方法是沒有實現的,要注意的一點是,只要加入了至少乙個元素函式就返回true,表示原來的集合

Cartographer原始碼篇 原始碼分析 1

在安裝編譯cartographer 1.0.0的時候,我們可以看到 主要包括cartorgarpher ros cartographer ceres sover三個部分。其中,ceres solver用於非線性優化,求解最小二乘問題 cartographer ros為ros平台的封裝,獲取感測器資料...

AbstractListView原始碼分析3

normal list that does not indicate choices public static final int choice mode none 0 the list allows up to one choice public static final int choice ...

Android AsyncTask原始碼分析

android中只能在主線程中進行ui操作,如果是其它子執行緒,需要借助非同步訊息處理機制handler。除此之外,還有個非常方便的asynctask類,這個類內部封裝了handler和執行緒池。本文先簡要介紹asynctask的用法,然後分析具體實現。asynctask是乙個抽象類,我們需要建立子...