(最近在看JDK源碼,只是拿著它的繼承圖在看,但很多東西不記錄仍然印象不深,所以開始記錄JDK閱讀系列。)
(一)Arrays
- Arrays比較特殊,直接繼承自Arrays -》List(Interface) -》Collection(Interface)。
- (Maybe因為Java中的數組本身就比較特殊?)
- 包含一些用來操作數組的一些方法,比如排序,搜索,復制,填充,toString方法等;
- 搜索使用二分搜索;
- 排序:使用DualPivotQuickSort中的排序算法,基本是改進版的快速排序,但里面做了很多性能改進。
- 當數組元素比較少時使用插入排序,或者改進后的插入排序(每次兩個元素一起插);
- 當數組元素較大時才會使用快排,使用兩個pivot,將數組劃分成四部分:<pivot1, pivot1<x<pivot2, 未排序, >pivot2
- 整個排序過程看起來有些麻煩,但確實提高了排序性能,下面會寫專門一篇排序的(數組排序應該也是Arrays類中的關鍵及精髓了)
?
(二)LinkedList
- 繼承關系為:LinkedList -》Abstract Sequential List -》 Abstract List
- 使用鏈表的各種操作,其中為了提高效率,類中有first和last變量記錄鏈表的首部和尾部;每個節點都會有前驅和后繼;
- 這里要注意的是序列化的問題:
- 所有的私有成員變量都標識為transient,表示這些變量不會使用統一的序列化方法,而是由用戶自己定制。
- 序列化與反序列化:對象的序列化是指將Object對象轉化為byte序列,反之叫做對象的反序列化
- 序列化:ObjectOutputStream, ?反序列化:ObjectInputStream
- 序列化的好處:能夠自動彌補不同操作系統之間的差異。可以在運行Windows操作系統的計算機上創建一個對象,將其序列化,通過網絡將它發送給一臺運行Unix系統的計算機,然后在那里能夠準確的重新組裝,而不必擔心數據在不同機器上的表示會不同,也不必關心字節的順序或者其他任何細節;
?
(三)Vector
- 繼承關系為:vector -》 List(Interface), RandomAccess(Interface), AbstractList
- 使用數組存儲所有元素;
- 擴容:可以在構造函數中指定擴容大小;當容量溢出時擴容則為2倍擴;
- 大部分讀寫方法都是synchronized,所以是線程安全的。
?
(四)ArrayList
- 繼承關系為:ArrayList -》 List(Interface), RandomAccess(Interface), AbstractList
- 擴容:每次擴容為原來的1.5倍
- 基本如同數組的操作。
?
(五)Stack
- 繼承關系為:Stack-》Vector
- 所以使用了vector類的很多方法,然后封裝在pop,push,peek等方法中,實現stack的基本要求。
?