標籤:java 資料結構 電腦科學
Java大課堂:常用資料結構一背景在電腦科學的學習中,資料結構是個繞不開的問題。那麼我將在接下來的時間,簡明扼要的介紹常見資料結構以及部分源碼。下面我將簡單介紹本大課堂涉及到的內容。
眾所周知,一款好用的資料結構,不僅包括資料結構的實現,還有相關工具集。比如c++中stl有大量的工具函數,比如sort,accumulate,reduce,for_each,remove_if,count,count_if。其實在java中也有類似的實用演算法。下面我將介紹常用的資料結構以及工具集合。
Collection架構
Collection是最基本的集合介面,一個Collection代表一組Object,即Collection的元素(Elements)。一些Collection允許相同的元素而另一些不行。一些能排序而另一些不行。JavaSDK不提供直接繼承自Collection的類,Java SDK提供的類都是繼承自Collection的“子介面”如List和Set。
所有實現Collection介面的類都必須提供兩個標準的建構函式:無參數的建構函式用於建立一個空的Collection,有一個Collection參數的建構函式用於建立一個新的Collection,這個新的Collection與傳入的Collection有相同的元素。後一個建構函式允許使用者複製一個Collection。
List是有序的Collection,使用此介面能夠精確的控制每個元素插入的位置。使用者能夠使用索引(元素在List中的位置,類似於數組下標)來訪問List中的元素,這類似於Java的數組。
和下面要提到的Set不同,List允許有相同的元素。
除了具有Collection介面必備的iterator()方法外,List還提供一個listIterator()方法,返回一個ListIterator介面,和標準的Iterator介面相比,ListIterator多了一些add()之類的方法,允許添加,刪除,設定元素,還能向前或向後遍曆。
實現List介面的常用類有LinkedList,ArrayList,Vector和Stack。
Set是一種不包含重複的元素的Collection,即任意的兩個元素e1和e2都有e1.equals(e2)=false,Set最多有一個null元素。
很明顯,Set的建構函式有一個約束條件,傳入的Collection參數不能包含重複的元素。
請注意:必須小心操作可變對象(Mutable Object)。如果一個Set中的可變元素改變了自身狀態導致Object.equals(Object)=true將導致一些問題。
Map架構
Map也是介面,但沒有繼承Collection介面。該介面描述了從不重複的鍵到值的映射。Map介面用於維護鍵/值對(key/value pairs)。
特徵:它描述了從不重複的鍵到值的映射。
兩個重要的實作類別:HashMap和TreeMap
1.HashMap,中文叫散列表,基於雜湊表實現,特點就是鍵值對的映射關係。一個key對應一個Value。HashMap中元素的排列順序是不固定的。更加適合於對元素進行插入、刪除和定位。
2.TreeMap,基於紅黑樹實現。TreeMap中的元素保持著某種固定的順序。更加適合於對元素的順序遍曆
迭代器
迭代器是一種設計模式,它是一個對象,它可以遍曆並選擇序列中的對象,而開發人員不需要瞭解該序列的底層結構。迭代器通常被稱為“輕量級”對象,因為建立它的代價小。
Collections工具類
java.util.Collections 是一個封裝類(工具類/協助類)。它包含有各種有關集合操作的靜態多態方法。此類不能執行個體化,就像一個工具類,用於對集合中元素進行排序、搜尋以及安全執行緒等各種操作,服務於Java的Collection架構。
它類似於stl中的sort,remove等。
比較子
java的比較子有兩類,分別是Comparable介面和Comparator介面。
在為對象數組進行排序時,比較子的作用非常明顯。
區別是Comparable被比較對象本身implements,添加方法。這個類似於c++類內部重載操作符’<’
Comparator需要實現一個比較類。這個類似於c++類外部實現比較函數或者仿函數。
總結
我們在學習使用java的類庫時,不僅僅要學會使用,還要知其所以然。另一方面要有開闊的眼界,寫出好看的代碼。比如,排序,用系統提供的介面,而不是自己實現。盡量使用lambda代替匿名內部類等。接下來第二講將是Collection架構中的List介面。
Java大課堂:常用資料結構一