天天看點

08Java筆記—集合類

集合類

數組與集合的比較:

  1>數組中隻能存貯同類型的元素,集合中可以存放任何類型的對象。

  2>數組不能自動擴充,而集合則可以自動擴充。

集合(集合類的對象)是用來管理其他若幹對象的,它類似于C++标準模闆庫中的容器,不過在JAVA的集合類的對象中可以用來存放多種類型的對象。

接口和類共同構成了一個集合架構,集合的概念,一個對象可以裝載多個對象,這個對象就是集合對象。

集合架構

1,接口

Collection 用來管理多個對象,集合中的每個元素都是對象。

Map,Map中沒有對象,而是鍵值對,由Key,value組成的鍵值對,Key是不可重複的。value是可以相同的,一個Key和一個value一一對應。

集合中用到的類,接口在java.util包中,在使用時注意将其引入import。

Collection 接口(以下介紹其子接口)

1)List 一個List的實作類的對象在管理多個對象時會按順序組織對象(即按照将對象放入的順序存儲),List實作類的對象是有順序的,List實作類對象中的内容是是可重複的。(注意,順序和排序的差別)

2)Set 一個Set的實作類表示一個數學概念上的集合,Set的實作類的對象中的元素是無順序的,也就是不會按照輸入順序來存放,Set的實作類對象中的元素是不重複的。

3)SortedSet,他是Set的子接口,他的實作類會對集合中的元素進行排序。但是要指定排序規則,他會按排序規則進行排序。

Map 接口(以下介紹其子接口)

SortedMap,這個接口的實作類同樣可以實作,不過是對鍵值對中的Key進行排序,這個接口的實作類也是要指定排序規則的。

JDK1.4中的集合是不安全的對象,JDK5.0中解決了這個問題。

List接口的實作類

1> ArrayList是接近于功能的集合類,ArryList的實質就是一個會自動增長的數組,ArrayList是用封裝的數組來實作的List接口的。

Collection的實作類對象的周遊方式是用疊代來實作的。

在使用疊代器時先要活得一個疊代器的對象,Iterator(疊代器接口)這是一個接口,疊代器是在集合類中實作的,也就是說,他是一個内部類(匿名内部類)實作的。

Iterator接口中定義的常用方法方法hasNext(),next()。

hasNext(),這個方法會使用一個遊标,并通過判斷遊标指向的位置是否存放有對象。

next()方法也是Iterator接口中定義好的方法,這個方法會使遊标指向下一個元素的位置,遊标會跳過第一個元素,并傳回其中的内容。

Collections 這是一個工具類,也是java.util包中的,這個類中的sort(list接口的實作類的對象)方法,其參數是一個集合類的對象,這個方法使用來對集合類的對象進行排序的。以後,我将以集合這個名字來稱呼集合類的對象。,對于字元串對象内容的集合來說會按字典順序排序(升序),對于數字内容的集合排序也會按照升序排序。

排序可一份為兩部分内容,一個是排序的規則,也就是按照什麼來進行排序,并且排成什麼樣的順序。

第二個就是排序的算法,他決定了排序的效率。

在對自定義的集合内容類型排序時,需要先定義那個類型的排序規則。

Comparable接口,這個接口中隻定義了一個compareTo(Object o),方法的傳回至類型是整型,如果目前對象大于參數對象就傳回正數,目前對象等于參數對象是就傳回0,目前對象小于參數對象時就傳回負值,這樣寫就是升序排列,反之則是進行降序排列,在實作這個接口中的方法時,傳回值定義方式,隻有這兩種。

根據指定類型的排序規則實作了Comparable接口,那麼就可以對存有這個類型的集合進行整體排序。Comparable接口,也叫做可比較接口。這個接口在java.lang包下。隻要實作了這個接口,就是可排序的。

接下來介紹另外一種對自定義類型對象的集合整體排序的方法,也就是實作比較器接口(Comparator),這個接口中定義了一個compare(Object o1,Object o2)方法來比較兩個對象,這個方法的傳回值定義和上面介紹的那個方法是一樣。

注意:在API,幫助文檔中以上兩個方法的參數類型是T,這代表的模闆類型,也就是集合中存放的内容的類型,在JDK1.4中其參數就是Object類型,模闆類型的詳細内容會在最後的JDK5.0新特性中講到。

Comparator接口可以在匿名内部類中實作,Collections 中的sort(集合了的對象,比較器)方法,可以對自定義類型内容的集合進行整體排序。

2> LinkedList,它是List接口的實作類,其底層是用雙向循環連結清單來實作的。

注意:ArrayList的查詢效率比較高,增删動作的效率比較差,适用于查詢比較頻繁,增删動作較少的元素管理的集合。

      LinkedList的查詢效率低,但是增删效率很高。适用于增删動作的比較頻繁,查詢次數較少的元素管理集合。

ArrayList,LinkedList都是線程不安全的。

實作堆棧 1,數組(ArrayList,增删效率比較低,不适合)

  2,LinkedList(實作堆棧的好方法)

  3,java.util.Stack類,Stack是Vector的子類,Vector類是一個線程安全的(是一個重量級的類),并繼承了Vector的方法,Verctor類(這個類也是List接口的實作類)和ArrayList的功能近乎相同。(不推薦使用Stack類來實作堆棧)。

Set接口的實作類

HashSet

Set的實作類的集合對象中不能夠有重複元素,HashSet也一樣他是使用了一種辨別來确定元素的不重複,HashSet用一種算法來保證HashSet中的元素是不重複的,HashSet的底層實作還是數組。

Object類中的hashCode()的方法是所有子類都會繼承這個方法,這個方法會用Hash算法算出一個Hash(哈希)碼值傳回,HashSet會用Hash碼值去和數組長度取模,模(這個模就是對象要存放在數組中的位置)相同時才會判斷數組中的元素和要加入的對象的内容是否相同,如果不同才會添加進去。

Hash算法是一種雜湊演算法。

注意:是以要存入HashSet的集合對象中的自定義類必須覆寫hashCode(),equals()兩個方法,才能保證集合中元素容不重複。在覆寫和hashCode()方法時,要使相同對象的hashCode()方法傳回相同值,覆寫equals()方法再判斷其内容。為了保證效率,是以在覆寫hashCode()方法時,也要盡量使不同對象盡量傳回不同的Hash碼值。

如果數組中的元素和要加入的對象的hashCode()傳回了相同的Hash值(相同對象),才會用equals()方法來判斷兩個對象的内容是否相同。

SortedSet接口是Set的子接口。

TreeSet是SortedSet接口的實作類,他可以對集合中的元素進行排序。

要存放在TreeSet中自定義類的對象,這個類要麼是已經實作了Comparable接口,要麼是能給出Comparator比較器,TreeSet可以自動過濾掉重複元素是以不用重載hashCode()方法,TreeSet會根據比較規則判斷元素内容是否相同,TreeSet會在元素存入世就進行了排序。(在TreeSet給出排序規則時,一定要注意對象内容相等的條件,一定要注意在主觀的認為兩個對象内容相同時,才可以使用比較少的條件來進行判斷)

在要排序時才使用TreeSet類(存儲效率比較低),HashSet的存儲效率比較高,在需要為HashSet的對象排序時,就可以把HashSet中的元素放入TreeSet。

Map接口的實作類

Map中隻可以存放鍵值對(Key,value),其中Key是不可以重複的。Key和value是一一對應的。

HashMap,是Map接口的實作類,Key時無序存放的,其中Key是不可以重複的,它也是通過Hash碼值來保證Key不重複的,Key和value是一一對應的。如果要加入的鍵值對和HashMap中鍵值對的Key是相同的就會将這個集合中的Key所隊應的value值進行覆寫,在使用自定義類型作為Key時,那就是要覆寫hashCode(),equals()方法,也就是和HashSet中要放入自定義類型是的處理方法相同。這個類的對象是線程不安全的。

在周遊Map時,要使用其keySet()方法獲得Key的一個Set集合,可以通過周遊這個Set,用get()方法來獲得Key所對應的value,也就周遊了Map。

Hashtabl,也是Map接口的實作類,他和HashMap比較相似,隻不過這個類對象是重量級的,也是線程安全的。他不允許Key和value為null。

Properties,這個類是Hashtable的子類,他的Key和value隻能是字元串。

SortedMap是Map的子接口

TreeMap,是SortedMap的實作類,他會按照Key進行排序。和TreeSet類一樣,在使用自定義類作Key時,要用自定義類實作Comparable接口。

注意:其實HashSet底層就是一個HashMap,隻不過其中的value值都是null值,而HashMap的底層是用數組實作的。