Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)
寫在前面:由于前天項目老師建設局的項目快到驗收階段,所以,前天晚上通宵,昨天睡了大半天,下午我們宿舍聚會,所以時間有點耽誤,希望大家見諒
上接:
Java程序員從笨鳥到菜鳥之(四)java開發常用類(包裝,數字處理集合等)(上)
3.Set 接?口 也是 Collection 的一種擴展,而與 List 不同的時,在 Set 中的對象元素不能重復,也就是說你不能把同樣的東西兩次放入同一個 Set 容器中。?它的常用具體實現有 HashSet 和 TreeSet 類。 HashSet 能快速定位一個元素,但是你放到 HashSet 中的對象需要實現? hashCode() 方法,它使用了前面說過的哈希碼的算法。而 TreeSet 則將放入其中的元素按序存放,這就要求你放入其中的對象是可排序的,這就用?到了集合框架提供的另外兩個實用類 Comparable 和 Comparator 。一個類是可排序的,它就應該實現 Comparable 接口。有時多個類具?有相同的排序算法,那就不需要在每分別重復定義相同的排序算法,只要實現 Comparator 接口即可。集合框架中還有兩個很實用的公用?類: Collections 和 Arrays 。 Collections 提供了對一個 Collection 容器進行諸如排序、復制、查找和填充等一些非常有用?的方法, Arrays 則是對一個數組進行類似的操作。?
Hash表
Hash表是一種數據結構,用來查找對象。Hash表為每個對象計算出一個整數,稱為Hash?Code(哈希碼)。Hash表是個鏈接式列表的陣列。每個列表稱為一個buckets(哈希表元)。對象位置的計算 index?=?HashCode?%?buckets?(HashCode為對象哈希碼,buckets為哈希表元總數)。
當你添加元素時,有時你會遇到已經填充了元素的哈希表元,這種情況稱為Hash?Collisions(哈希沖突)。這時,你必須判斷該元素是否已經存在于該哈希表中。
如果哈希碼是合理地隨機分布的,并且哈希表元的數量足夠大,那么哈希沖突的數量就會減少。同時,你也可以通過設定一個初始的哈希表元數量來更好地控制哈?希表的運行。初始哈希表元的數量為 buckets?=?size?*?150%?+?1?(size為預期元素的數量)。
如果哈希?表中的元素放得太滿,就必須進行rehashing(再哈希)。再哈希使哈希表元數增倍,并將原有的對象重新導入新的哈希表元中,而原始的哈希表元被刪?除。load?factor(加載因子)決定何時要對哈希表進行再哈希。在Java編程語言中,加載因子默認值為0.75,默認哈希表元為101。
Comparable接口和Comparator接口
在“集合框架”中有兩種比較接口:Comparable接口和Comparator接口。像String和Integer等Java內建類實現?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):?對兩個對象o1和o2進行比較,如果o1位于o2的前面,則返回負值,如果在排序順序中認為o1和o2是相同的,返回0,如果o1位于o2的后面,則返回正值
?“與Comparable相似,0返回值不表示元素相等。一個0返回值只是表示兩個對象排在同一位置。由Comparator用戶決定如何處理。如果兩個不相等的元素比較的結果為零,您首先應該確信那就是您要的結果,然后記錄行為。”
?(2)boolean?equals(Object?obj):?指示對象obj是否和比較器相等。
“該方法覆寫Object的equals()方法,檢查的是Comparator實現的等同性,不是處于比較狀態下的對象。”?
SortedSet接口
“集合框架”提供了個特殊的Set接口:SortedSet,它保持元素的有序順序。SortedSet接口為集的視圖(子集)和它的兩端(即頭和尾)?提供了訪問方法。當您處理列表的子集時,更改視圖會反映到源集。此外,更改源集也會反映在子集上。發生這種情況的原因在于視圖由兩端的元素而不是下標元素?指定,所以如果您想要一個特殊的高端元素(toElement)在子集中,您必須找到下一個元素。
添加到SortedSet實現類的元素必須實現Comparable接口,否則您必須給它的構造函數提供一個Comparator接口的實現。TreeSet類是它的唯一一份實現。
?“因為集必須包含唯一的項,如果添加元素時比較兩個元素導致了0返回值(通過Comparable的compareTo()方法或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的一個視圖,其內各元素皆大于或等于fromElement
AbstractSet抽象類
AbstractSet類覆蓋了Object類的equals()和hashCode()方法,以確保兩個相等的集返回相同的哈希碼。若兩個集大小相等?且包含相同元素,則這兩個集相等。按定義,集的哈希碼是集中元素哈希碼的總和。因此,不論集的內部順序如何,兩個相等的集會有相同的哈希碼。
HashSet類類和TreeSet類
“集合框架”支持Set接口兩種普通的實現:HashSet和TreeSet(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):?構建一個擁有特定容量和加載因子的空哈希集。LoadFactor是0.0至1.0之間的一個數
TreeSet類
(1)?TreeSet():構建一個空的樹集
(2)?TreeSet(Collection?c):?構建一個樹集,并且添加集合c中所有元素
(3)?TreeSet(Comparator?c):?構建一個樹集,并且使用特定的比較器對其元素進行排序
“comparator比較器沒有任何數據,它只是比較方法的存放器。這種對象有時稱為函數對象。函數對象通常在“運行過程中”被定義為匿名內部類的一個實例。”
?TreeSet(SortedSet?s):?構建一個樹集,添加有序集合s中所有元素,并且使用與有序集合s相同的比較器排序
LinkedHashSet類
LinkedHashSet擴展HashSet。如果想跟蹤添加給HashSet的元素的順序,LinkedHashSet實現會有幫助。?LinkedHashSet的迭代器按照元素的插入順序來訪問各個元素。它提供了一個可以快速訪問各個元素的有序集合。同時,它也增加了實現的代價,因為?哈希表元中的各個元素是通過雙重鏈接式列表鏈接在一起的。
(1)?LinkedHashSet():?構建一個空的鏈接式哈希集
(2)?LinkedHashSet(Collection?c):?構建一個鏈接式哈希集,并且添加集合c中所有元素
(3)?LinkedHashSet(int?initialCapacity):?構建一個擁有特定容量的空鏈接式哈希集
(4)?LinkedHashSet(int?initialCapacity,?float?loadFactor):?構建一個擁有特定容量和加載因子的空鏈接式哈希集。LoadFactor是0.0至1.0之間的一個數
“為優化HashSet空間的使用,您可以調優初始容量和負載因子。TreeSet不包含調優選項,因為樹總是平衡的。”
4.Map是一種把鍵對象和值對象進行關聯的容器,而一個值對象又可以是一個Map,依次類推,這樣就可形成一個多級映射。對于鍵對象來說,像Set一樣,一?個Map容器中的鍵對象不允許重復,這是為了保持查找結果的一致性;如果有兩個鍵對象一樣,那你想得到那個鍵對象所對應的值對象時就有問題了,可能你得到?的并不是你想的那個值對象,結果會造成混亂,所以鍵的唯一性很重要,也是符合集合的性質的。當然在使用過程中,某個鍵所對應的值對象可能會發生變化,這時?會按照最后一次修改的值對象與鍵對應。對于值對象則沒有唯一性的要求。你可以將任意多個鍵都映射到一個值對象上,這不會發生任何問題(不過對你的使用卻可?能會造成不便,你不知道你得到的到底是那一個鍵所對應的值對象)。Map有兩種比較常用的實現:HashMap和TreeMap。HashMap也用到了?哈希碼的算法,以便快速查找一個鍵,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相關的對象,如果沒有在該映像中找到該關鍵字,則返回null
boolean?containsKey(Object?key):?判斷映像中是否存在關鍵字key
boolean?containsValue(Object?value):?判斷映像中是否存在值value
int?size():?返回當前映像中映射的數量
boolean?isEmpty()?:判斷映像中是否有任何映射
(3)?視圖操作?:處理映像中鍵/值對組
Set?keySet():?返回映像中所有關鍵字的視圖集
“因為映射中鍵的集合必須是唯一的,您用Set支持。你還可以從視圖中刪除元素,同時,關鍵字和它相關的值將從源映像中被刪除,但是你不能添加任何元素。”
?Collection?values():返回映像中所有值的視圖集
“因為映射中值的集合不是唯一的,您用Collection支持。你還可以從視圖中刪除元素,同時,值和它的關鍵字將從源映像中被刪除,但是你不能添加任何元素。”
?Set?entrySet():?返回Map.Entry對象的視圖集,即映像中的關鍵字/值對
“因為映射是唯一的,您用Set支持。你還可以從視圖中刪除元素,同時,這些元素將從源映像中被刪除,但是你不能添加任何元素。”
Map.Entry接口
Map的entrySet()方法返回一個實現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返回值(通過Comparable的compareTo()方?法或通過Comparator的compare()方法),那么,原始鍵對應值被新的值替代。如果兩個元素相等,那還好。但如果不相等,那么您就應該修改?比較方法,讓比較方法和?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皆大于或等于fromKey
AbstractMap抽象類
和其它抽象集合實現相似,AbstractMap?類覆蓋了equals()和hashCode()方法以確保兩個相等映射返回相同的哈希碼。如果兩個映射大小相等、包含同樣的鍵且每個鍵在這兩個映射中對?應的值都相同,則這兩個映射相等。映射的哈希碼是映射元素哈希碼的總和,其中每個元素是Map.Entry接口的一個實現。因此,不論映射內部順序如何,?兩個相等映射會報告相同的哈希碼。
HashMap類和TreeMap類
“集合框架”提供兩種常規的?Map實現:HashMap和TreeMap?(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):?構建一個擁有特定容量和加載因子的空的哈希映像
TreeMap類
TreeMap沒有調優選項,因為該樹總處于平衡狀態。
(1)?TreeMap():構建一個空的映像樹
(2)?TreeMap(Map?m):?構建一個映像樹,并且添加映像m中所有元素
(3)?TreeMap(Comparator?c):?構建一個映像樹,并且使用特定的比較器對關鍵字進行排序
(4)?TreeMap(SortedMap?s):?構建一個映像樹,添加映像樹s中所有映射,并且使用與有序映像s相同的比較器排序
LinkedHashMap類
LinkedHashMap擴展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。
?本文來自:曹勝歡博客專欄。轉載請注明出處:http://blog.csdn.Net/csh624366188
from:?http://blog.csdn.net/csh624366188/article/details/7294878
總結
以上是生活随笔為你收集整理的Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java程序员从笨鸟到菜鸟之(四)jav
- 下一篇: java美元兑换,(Java实现) 美元