1. 程式人生 > >Java程式設計師從笨鳥到菜鳥之(五)java開發常用類(包裝,數字處理集合等)(下)

Java程式設計師從笨鳥到菜鳥之(五)java開發常用類(包裝,數字處理集合等)(下)

               

寫在前面:由於前天專案老師建設局的專案快到驗收階段,所以,前天晚上通宵,昨天睡了大半天,下午我們宿舍聚會,所以時間有點耽誤,希望大家見諒

上接:

3.Set接 口也是Collection的一種擴充套件,而與List不同的時,在Set中的物件元素不能重複,也就是說你不能把同樣的東西兩次放入同一個Set容器中。 它的常用具體實現有HashSetTreeSet類。HashSet能快速定位一個元素,但是你放到HashSet中的物件需要實現 hashCode()方法,它使用了前面說過的雜湊碼的演算法。而TreeSet則將放入其中的元素按序存放,這就要求你放入其中的物件是可排序的,這就用 到了集合框架提供的另外兩個實用類
ComparableComparator。一個類是可排序的,它就應該實現Comparable介面。有時多個類具 有相同的排序演算法,那就不需要在每分別重複定義相同的排序演算法,只要實現Comparator介面即可。集合框架中還有兩個很實用的公用 類:CollectionsArraysCollections提供了對一個Collection容器進行諸如排序、複製、查詢和填充等一些非常有用 的方法,Arrays則是對一個數組進行類似的操作。 

HashHash表是一種資料結構,用來查詢物件。Hash表為每個物件計算出一個整數,稱為Hash Code(雜湊碼)Hash表是個連結式列表的陣列。每個列表稱為一個

buckets(雜湊表元)。物件位置的計算 index = HashCode % buckets (HashCode為物件雜湊碼,buckets為雜湊表元總數)當你新增元素時,有時你會遇到已經填充了元素的雜湊表元,這種情況稱為Hash Collisions(雜湊衝突)。這時,你必須判斷該元素是否已經存在於該雜湊表中。如果雜湊碼是合理地隨機分佈的,並且雜湊表元的數量足夠大,那麼雜湊衝突的數量就會減少。同時,你也可以通過設定一個初始的雜湊表元數量來更好地控制哈 希表的執行。初始雜湊表元的數量為 buckets = size * 150% + 1 (size為預期元素的數量)如果雜湊 表中的元素放得太滿,就必須進行
rehashing(再雜湊)。再雜湊使雜湊表元數增倍,並將原有的物件重新匯入新的雜湊表元中,而原始的雜湊表元被刪 除。load factor(載入因子)決定何時要對雜湊表進行再雜湊。在Java程式語言中,載入因子預設值為0.75,預設雜湊表元為101Comparable介面和Comparator介面集合框架中有兩種比較介面:Comparable介面和Comparator介面。像StringIntegerJava內建類實現 Comparable介面以提供一定排序方式,但這樣只能實現該介面一次。對於那些沒有實現Comparable介面的類、或者自定義的類,您可以通過 Comparator介面來定義您自己的比較方式。Comparable介面java.lang包中,Comparable介面適用於一個類有自然順序的時候。假定物件集合是同一型別,該介面允許您把集合排序成自然順序。(1) int compareTo(Object o): 比較當前例項物件與物件o,如果位於物件o之前,返回負值,如果兩個物件在排序中位置相同,則返回0,如果位於物件o後面,則返回正值 在 Java 2 SDK版本1.4中有二十四個類實現Comparable介面。下表展示了8種基本型別的自然排序。雖然一些類共享同一種自然排序,但只有相互可比的類才能排序。

排序

BigDecimal,BigInteger,Byte, Double, Float,Integer,Long,Short

按數字大小排序

Character

按 Unicode 值的數字大小排序

String

按字串中字元 Unicode 值排序

利用Comparable介面建立您自己的類的排序順序,只是實現compareTo()方法的問題。通常就是依賴幾個資料成員的自然排序。同時類也應該覆蓋equals()hashCode()以確保兩個相等的物件返回同一個雜湊碼。

Comparator介面若一個類不能用於實現java.lang.Comparable,或者您不喜歡預設的Comparable行為並想提供自己的排序順序(可能多種排序方式),你可以實現Comparator介面,從而定義一個比較器。(1)int compare(Object o1, Object o2): 對兩個物件o1o2進行比較,如果o1位於o2的前面,則返回負值,如果在排序順序中認為o1o2是相同的,返回0,如果o1位於o2的後面,則返回正值 “Comparable相似,0返回值不表示元素相等。一個0返回值只是表示兩個物件排在同一位置。由Comparator使用者決定如何處理。如果兩個不相等的元素比較的結果為零,您首先應該確信那就是您要的結果,然後記錄行為。 (2)boolean equals(Object obj): 指示物件obj是否和比較器相等。該方法覆寫Objectequals()方法,檢查的是Comparator實現的等同性,不是處於比較狀態下的物件。” 

SortedSet介面集合框架提供了個特殊的Set介面:SortedSet,它保持元素的有序順序。SortedSet介面為集的檢視(子集)和它的兩端(即頭和尾) 提供了訪問方法。當您處理列表的子集時,更改檢視會反映到源集。此外,更改源集也會反映在子集上。發生這種情況的原因在於檢視由兩端的元素而不是下標元素 指定,所以如果您想要一個特殊的高階元素(toElement)在子集中,您必須找到下一個元素。新增到SortedSet實現類的元素必須實現Comparable介面,否則您必須給它的建構函式提供一個Comparator介面的實現。TreeSet類是它的唯一一份實現。 “因為集必須包含唯一的項,如果新增元素時比較兩個元素導致了0返回值(通過ComparablecompareTo()方法或Comparator compare()方法),那麼新元素就沒有新增進去。如果兩個元素相等,那還好。但如果它們不相等的話,您接下來就應該修改比較方法,讓比較方法和 equals() 的效果一致。(1) Comparator comparator(): 返回對元素進行排序時使用的比較器,如果使用Comparable介面的compareTo()方法對元素進行比較,則返回null(2) Object first(): 返回有序集合中第一個(最低)元素(3) Object last(): 返回有序集合中最後一個(最高)元素(4)SortedSet subSet(Object fromElement, Object toElement): 返回從fromElement(包括)toElement(不包括)範圍內元素的SortedSet檢視(子集)(5) SortedSet headSet(Object toElement): 返回SortedSet的一個檢視,其內各元素皆小於toElement(6) SortedSet tailSet(Object fromElement): 返回SortedSet的一個檢視,其內各元素皆大於或等於fromElementAbstractSet抽象類AbstractSet類覆蓋了Object類的equals()hashCode()方法,以確保兩個相等的集返回相同的雜湊碼。若兩個集大小相等 且包含相同元素,則這兩個集相等。按定義,集的雜湊碼是集中元素雜湊碼的總和。因此,不論集的內部順序如何,兩個相等的集會有相同的雜湊碼。

HashSet類類和TreeSet集合框架支援Set介面兩種普通的實現:HashSetTreeSet(TreeSet實現SortedSet介面)。在更多情況下,您會使用 HashSet 儲存重複自由的集合。考慮到效率,新增到 HashSet 的物件需要採用恰當分配雜湊碼的方式來實現hashCode()方法。雖然大多數系統類覆蓋了 Object中預設的hashCode()equals()實現,但建立您自己的要新增到HashSet的類時,別忘了覆蓋 hashCode()equals()當您要從集合中以有序的方式插入和抽取元素時,TreeSet實現會有用處。為了能順利進行,新增到TreeSet的元素必須是可排序的。HashSet(1) HashSet(): 構建一個空的雜湊集(2) HashSet(Collection c): 構建一個雜湊集,並且新增集合c中所有元素(3) HashSet(int initialCapacity): 構建一個擁有特定容量的空雜湊集(4) HashSet(int initialCapacity, float loadFactor): 構建一個擁有特定容量和載入因子的空雜湊集。LoadFactor0.01.0之間的一個數TreeSet(1) TreeSet():構建一個空的樹集(2) TreeSet(Collection c): 構建一個樹集,並且新增集合c中所有元素(3) TreeSet(Comparator c): 構建一個樹集,並且使用特定的比較器對其元素進行排序“comparator比較器沒有任何資料,它只是比較方法的存放器。這種物件有時稱為函式物件。函式物件通常在執行過程中被定義為匿名內部類的一個例項。 TreeSet(SortedSet s): 構建一個樹集,新增有序集合s中所有元素,並且使用與有序集合s相同的比較器排序LinkedHashSetLinkedHashSet擴充套件HashSet。如果想跟蹤新增給HashSet的元素的順序,LinkedHashSet實現會有幫助。 LinkedHashSet的迭代器按照元素的插入順序來訪問各個元素。它提供了一個可以快速訪問各個元素的有序集合。同時,它也增加了實現的代價,因為 雜湊表元中的各個元素是通過雙重連結式列表連結在一起的。(1) LinkedHashSet(): 構建一個空的連結式雜湊集(2) LinkedHashSet(Collection c): 構建一個連結式雜湊集,並且新增集合c中所有元素(3) LinkedHashSet(int initialCapacity): 構建一個擁有特定容量的空連結式雜湊集(4) LinkedHashSet(int initialCapacity, float loadFactor): 構建一個擁有特定容量和載入因子的空連結式雜湊集。LoadFactor0.01.0之間的一個數為優化HashSet空間的使用,您可以調優初始容量和負載因子。TreeSet不包含調優選項,因為樹總是平衡的。

4.Map是一種把鍵物件和值物件進行關聯的容器,而一個值物件又可以是一個Map,依次類推,這樣就可形成一個多級對映。對於鍵物件來說,像Set一樣,一 個Map容器中的鍵物件不允許重複,這是為了保持查詢結果的一致性;如果有兩個鍵物件一樣,那你想得到那個鍵物件所對應的值物件時就有問題了,可能你得到 的並不是你想的那個值物件,結果會造成混亂,所以鍵的唯一性很重要,也是符合集合的性質的。當然在使用過程中,某個鍵所對應的值物件可能會發生變化,這時 會按照最後一次修改的值物件與鍵對應。對於值物件則沒有唯一性的要求。你可以將任意多個鍵都對映到一個值物件上,這不會發生任何問題(不過對你的使用卻可 能會造成不便,你不知道你得到的到底是那一個鍵所對應的值物件)。Map有兩種比較常用的實現:HashMapTreeMapHashMap也用到了 雜湊碼的演算法,以便快速查詢一個鍵,TreeMap則是對鍵按序存放,因此它便有一些擴充套件的方法,比如firstKey(),lastKey()等,你還 可以從TreeMap中指定一個範圍以取得其子Map。鍵和值的關聯很簡單,用pub(Object key,Object value)方法即可將一個鍵與一個值物件相關聯。用get(Object key)可得到與此key物件所對應的值物件。

Map介面不是Collection介面的繼承。Map介面用於維護鍵/值對(key/value pairs)。該介面描述了從不重複的鍵到值的對映。(1) 新增、刪除操作:Object put(Object key, Object value): 將互相關聯的一個關鍵字與一個值放入該映像。如果該關鍵字已經存在,那麼與此關鍵字相關的新值將取代舊值。方法返回關鍵字的舊值,如果關鍵字原先並不存在,則返回null Object remove(Object key): 從映像中刪除與key相關的對映void putAll(Map t): 將來自特定映像的所有元素新增給該映像void clear(): 從映像中刪除所有對映鍵和值都可以為null。但是,您不能把Map作為一個鍵或值新增給自身。(2) 查詢操作:Object get(Object key): 獲得與關鍵字key相關的值,並且返回與關鍵字key相關的物件,如果沒有在該映像中找到該關鍵字,則返回nullboolean containsKey(Object key): 判斷映像中是否存在關鍵字keyboolean containsValue(Object value): 判斷映像中是否存在值valueint size(): 返回當前映像中對映的數量boolean isEmpty() :判斷映像中是否有任何對映(3) 檢視操作 :處理映像中鍵/值對組Set keySet(): 返回映像中所有關鍵字的檢視集因為對映中鍵的集合必須是唯一的,您用Set支援。你還可以從檢視中刪除元素,同時,關鍵字和它相關的值將從源映像中被刪除,但是你不能新增任何元素。 Collection values():返回映像中所有值的檢視集因為對映中值的集合不是唯一的,您用Collection支援。你還可以從檢視中刪除元素,同時,值和它的關鍵字將從源映像中被刪除,但是你不能新增任何元素。 Set entrySet(): 返回Map.Entry物件的檢視集,即映像中的關鍵字/值對因為對映是唯一的,您用Set支援。你還可以從檢視中刪除元素,同時,這些元素將從源映像中被刪除,但是你不能新增任何元素。

Map.Entry介面MapentrySet()方法返回一個實現Map.Entry介面的物件集合。集合中每個物件都是底層Map中一個特定的鍵/值對。通過這個集合的迭代器,您可以獲得每一個條目(唯一獲取方式)的鍵或值並對值進行更改。當條目通過迭代器返回後,除非是迭代器自身的remove()方 法或者迭代器返回的條目的setValue()方法,其餘對源Map外部的修改都會導致此條目集變得無效,同時產生條目行為未定義。 (1) Object getKey(): 返回條目的關鍵字(2) Object getValue(): 返回條目的值(3) Object setValue(Object value): 將相關映像中的值改為value,並且返回舊值SortedMap介面集合框架提供了個特殊的Map介面:SortedMap,它用來保持鍵的有序順序。SortedMap介面為映像的檢視(子集),包括兩個端點提供了訪問方法。除了排序是作用於對映的鍵以外,處理SortedMap和處理SortedSet一樣。 新增到SortedMap實現類的元素必須實現Comparable介面,否則您必須給它的建構函式提供一個Comparator介面的實現。TreeMap類是它的唯一一份實現。 “因為對於對映來說,每個鍵只能對應一個值,如果在新增一個鍵/值對時比較兩個鍵產生了0返回值(通過ComparablecompareTo()方 法或通過Comparatorcompare()方法),那麼,原始鍵對應值被新的值替代。如果兩個元素相等,那還好。但如果不相等,那麼您就應該修改 比較方法,讓比較方法和 equals() 的效果一致。(1) Comparator comparator(): 返回對關鍵字進行排序時使用的比較器,如果使用Comparable介面的compareTo()方法對關鍵字進行比較,則返回null(2) Object firstKey(): 返回映像中第一個(最低)關鍵字(3) Object lastKey(): 返回映像中最後一個(最高)關鍵字(4) SortedMap subMap(Object fromKey, Object toKey): 返回從fromKey(包括)toKey(不包括)範圍內元素的SortedMap檢視(子集)(5) SortedMap headMap(Object toKey): 返回SortedMap的一個檢視,其內各元素的key皆小於toKey(6) SortedSet tailMap(Object fromKey): 返回SortedMap的一個檢視,其內各元素的key皆大於或等於fromKeyAbstractMap抽象類和其它抽象集合實現相似,AbstractMap 類覆蓋了equals()hashCode()方法以確保兩個相等對映返回相同的雜湊碼。如果兩個對映大小相等、包含同樣的鍵且每個鍵在這兩個對映中對 應的值都相同,則這兩個對映相等。對映的雜湊碼是對映元素雜湊碼的總和,其中每個元素是Map.Entry介面的一個實現。因此,不論對映內部順序如何, 兩個相等對映會報告相同的雜湊碼。HashMap類和TreeMap集合框架提供兩種常規的 Map實現:HashMapTreeMap (TreeMap實現SortedMap介面)。在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。但如果您要按自然順序或自定義順序遍歷鍵,那麼TreeMap會更好。使用HashMap要求新增的鍵類明確定義了hashCode()和 equals()的實現。這個TreeMap沒有調優選項,因為該樹總處於平衡狀態。HashMap為了優化HashMap空間的使用,您可以調優初始容量和負載因子。(1) HashMap(): 構建一個空的雜湊映像(2) HashMap(Map m): 構建一個雜湊映像,並且新增映像m的所有對映(3) HashMap(int initialCapacity): 構建一個擁有特定容量的空的雜湊映像(4) HashMap(int initialCapacity, float loadFactor): 構建一個擁有特定容量和載入因子的空的雜湊映像TreeMapTreeMap沒有調優選項,因為該樹總處於平衡狀態。(1) TreeMap():構建一個空的映像樹(2) TreeMap(Map m): 構建一個映像樹,並且新增映像m中所有元素(3) TreeMap(Comparator c): 構建一個映像樹,並且使用特定的比較器對關鍵字進行排序(4) TreeMap(SortedMap s): 構建一個映像樹,新增映像樹s中所有對映,並且使用與有序映像s相同的比較器排序LinkedHashMapLinkedHashMap擴充套件HashMap,以插入順序將關鍵字/值對新增進連結雜湊映像中。象LinkedHashSet一樣,LinkedHashMap內部也採用雙重連結式列表。 (1) LinkedHashMap(): 構建一個空連結雜湊映像(2) LinkedHashMap(Map m): 構建一個連結雜湊映像,並且新增映像m中所有對映(3) LinkedHashMap(int initialCapacity): 構建一個擁有特定容量的空的連結雜湊映像(4) LinkedHashMap(int initialCapacity, float loadFactor): 構建一個擁有特定容量和載入因子的空的連結雜湊映像(5) LinkedHashMap(int initialCapacity, float loadFactor,boolean accessOrder): 構建一個擁有特定容量、載入因子和訪問順序排序的空的連結雜湊映像如果將accessOrder設定為true,那麼連結雜湊映像將使用訪問順序而不是插入順序來迭代各個映像。每次呼叫get或者put方法時,相關的對映便從它的當前位置上刪除,然後放到連結式映像列表的結尾處(只有連結式映像列表中的位置才會受到影響,雜湊表元則不受影響。雜湊表對映總是待在對應於關鍵字的雜湊碼的雜湊表元中)。 “該特性對於實現快取記憶體的刪除最近最少使用的原則很有用。例如,你可以希望將最常訪問的對映儲存在記憶體中,並且從資料庫中讀取不經常訪問的物件。 當你在表中找不到某個對映,並且該表中的對映已經放得非常滿時,你可以讓迭代器進入該表,將它列舉的開頭幾個對映刪除掉。這些是最近最少使用的對映。 (6) protected boolean removeEldestEntry(Map.Entry eldest): 如果你想刪除最老的對映,則覆蓋該方法,以便返回true。當某個對映已經新增給映像之後,便呼叫該方法。它的預設實現方法返回false,表示預設條件 下老的對映沒有被刪除。但是你可以重新定義本方法,以便有選擇地在最老的對映符合某個條件,或者映像超過了某個大小時,返回true