java集合框架整理(轉)

集合圖

java集合視頻版點擊查看

 

java集合就是一個容器。

1.     集合概述

l       爲了保存不確定的數據,或者對象,以及保存具有映射關係的數據。

l       所有的集合類都位於java.util包下。

1.1. 什麼是集合,有什麼特點?

面嚮對象語言對事物的體現都是以對象的形式存在,所以爲了方便對多個對象的操作,就對對象進行存儲,集合就是存儲對象最常用的一種方式。

集合只用於存儲對象,集合長度是可變的,集合可以存儲不同類型的對象。

1.2. 集合與數組的區別(集合特點)

 

首先我們要知道集合與數組是不同:

其中集合是可變長度的,集合中用size()

而數組是固定長度的,數組中是用length()

集合是用來放對象的,數組可以存儲基本數據也可以存儲引用數據類型;

有一點需要注意下,如果集合存放基本數據類型,在存取過程中會有個自動裝箱和拆箱

集合可以放任意對象(引用嘛),但是數組只能放相同的數據類型

對於如何使用集合,我們先看頂層的方法,然後去調用底層的子類來實現具體的功能。

      

1.3. 集合框架

由於集合內部的數據結構不同,集合分爲多種容器。這些容器不斷的向上抽取,就形成了集合框架。

Collection

       |----------List(有序,,元素都有索引(角標),元素可以重複)

                     |--------Vector:基於數組實現,同步,線程安全。增刪,查詢都慢。

|--------ArrayList基於數組實現,不同步,線程不安全,需要手動同步,查詢的速度快

|--------LinkedList基於鏈表實現,不同步,線程不安全,需要手動同步,增刪都很快

 

|----------Set(無序,元素不可以重複)

|--------HsahSet:基於哈希表實現,不同步的。

              |--------LinkedHsahSet

|--------TreeSet:基於二叉樹實現,不同步的。自然排序,定製排序

Map集合(鍵值對)

       |----------TreeMap基於二叉樹,可以排序

       |----------HashMap哈希表實現

Iterator迭代器

       |----------Collection每個集合都有迭代器

       |----------ListIterator主要用於List集合迭代,迭代過程可以操作元素

1.4. 集合常見方法

Collection的常見方法:

1,添加:boolean add(Object obj)://添加元素

       booleanaddAll(Collectioncoll)://添加給定集合到當前集合

2,刪除:boolean remove(object obj)://刪除元素

       booleanremoveAll(Collectioncoll);

         void clear();//清空集合

3,判斷:boolean contains(object obj)://是否包含指定元素

       booleancontainsAll(Colllectioncoll);//是否包含給定集合

       booleanisEmpty():判斷集合中是否有元素。

4,獲取:int size():

         Iterator iterator():取出元素的方式:迭代器。

5,其他:booleanretainAll(Collection coll);取交集。

         Object[] toArray():將集合轉成數組。

1.5.遍歷集合:迭代器 Iterator

也是集合框架的成員,但它主要用於遍歷集合中的對象,封裝了各種集合的底層細節,給集合框架提供了統一的接口。比如,這裏舉個例子。主要有3個方法:

booleanhashnext();如果仍有元素可以迭代,則返回true

E next() 返回迭代的下一個元素

void remove() 移除迭代器返回的最後一個元素

而對於map類集合有2中方式來遍歷:

1keySet()獲取鍵對應的Set集合,然後在用Iterator配合get(Object key)獲取每一個鍵所對應的值。

2entrySet()獲取鍵值對集合,存入Map.Entry<K,V>集合中,Iterator對其進行迭代,在用getKey()取出鍵,getValue()取出值。

1.6. 集合的一些技巧:

需要唯一嗎?

需要:Set

       需要制定順序:

                     需要:TreeSet

                     不需要:HashSet

                     但是想要一個和存儲一致的順序(有序):LinkedHashSet

不需要:List

       需要頻繁增刪嗎?

              需要:LinkedList

              不需要:ArrayList

 

 

l       看到array:就要想到數組,就要想到查詢快,有角標.

l       看到link:就要想到鏈表,就要想到增刪快,就要想要 add get remove+frist last的方法

l       看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆蓋hashcode方法和equals方法。

l       看到tree:就要想到二叉樹,就要想要排序,就要想到兩個接口Comparable,Comparator 。

2.       List集合

l   有序(存入和取出的順序一致),元素都有索引(角標),元素可以重複。

l   對於List,根據其內部結構不同又分爲Arraylist、LinkedList、Vector

l   共性特點:可以操作角標

2.1.List子系

List:

       |----Vector:數組數據結構,是同步的。增刪,查詢都很慢!已經唄ArrayList替代了

       |----ArrayList:數組數據結構,是不同步的。。查詢的速很度快。

       |----LinkedList:鏈表數據結構,是不同步的。增刪的速度很快。

2.2.List常用共性方法

1添加元素:

                     voidadd(intindex,Eelement);  //指定位置插入元素

                     void add(index,collection);      //將給定的集合添加到末尾

2刪除元素:

                     Object remove(index):      //刪除指定交表的元素,返被背刪除的

3修改元素:

                     Objectset(intindex,Eelement);       //用指定元素替換列表中指定位置的元素

4獲取元素:

                     Object get(index);      //返回列表中指定位置的元素

                     intindexOf(object);           //返回此列表中第一次出現的指定元素的索引,沒有返回-1

                     intlastIndexOf(object);     //返回此列表中最後一次出現的指定元素的索引,沒有返回-1

                     ListsubList(intfrom,intto);      //獲取子集包含頭不包含尾。

 

3.       Set集合

 

Set集合與Collection基本上一樣,只不過內部元素是無序的,不允許重複。Add之前,會判斷(equals方法)集合中是否包含此元素,如果包含返回true丙存入集合,如果不包含,返回false,不存。

n       1:HashSet:按hash算法來存儲集合中的元素,因此具有良好的存取和查找功能。

l       特點:

Ø       不保證順序。

Ø       不是同步的

Ø       集合元素可以是null

l       判斷元素是否相等

Ø       判斷hash值是否相等

Ø       Equals判斷內容是否相等

n       1:TreeSet:按存儲集合中的元素的compare或者比較器,來判斷是否需添加到集合。

l       特點:

Ø       自然順序或指定順序。

Ø       不是同步的

Ø       集合元素可以是null

l       判斷元素是否相等

Ø       判斷hash值是否相等

Ø       Equals判斷內容是否相等

 

3.1.LinkedHashSet的集合特點

              HashSet的一個子類,也是根據元素的hash值來判斷元素位置,但同時使用鏈表維護元素次序。由於需要維護次序,所以性能略低於hashSet,但在迭代訪問集合元素時,將有很好的性能。【有序不許重複】

 

3.2. 常用共性方法

1:增加元素:

              booleanadd(Object obj);//添加一個元素,在末尾位置

              booleanaddAll(Collection c);//添加一個集合,在末尾位置

2:刪除元素:

              booleanremove(Object obj);//刪除一個元素。

              booleanremoveAll(Collection c)//刪除包含c的元素。

              voidclear();//移除此集合的的所有元素

3:判斷元素:

              booleancontains(Object obj)//判斷是否包含某個元素。

              booleancontainsAll(Collection c);//在此集合中包含集合c中的所有元素

              booleanisEmpty();//判斷是否爲空集合。

             

4:獲取元素:

              intsize();//獲取size大小。

              Iteratoriterator();//迭代器,用於取出元素的。配合it.next()hasNext()組合使用。

 

 

3.3.Hash表確定元素是否相同

1:判斷兩個原素的hash值是否相同,如果相同個,判斷兩個內容是否相同

2:判斷hash值相同,其實是判斷hashCode()是否相同,判斷內容用equals()方法。

n       hashCode規則:

l       同一個對象多次調用返回的hashCode值相等。

l       2個對象euqals方法比較返回true時,他們hashCode也應相等。

l       對象中用作equals方法比較標準的field都應用來計算hashCode值

n       重寫hashDode規則:

l       把每個對象的有意義的field,計算出一個hashcode值。

l       用第一步計算出來的多個hashCode來組合成一個值返回。

l       爲了避免相加產生偶然相等。可以通過hashcode*一個質數相加返回。

例如:

Return name.hashCode*11 + age.hashCode*7;       

                    

 

練習:請定義ArryaList集合,並存儲Person對象。如newPerson("lisi",20);

並取出。將姓名和年齡打印出來。

3.4.TreeeSet排序的2種方式

1,  讓對象本身具備可比性。實現comparable接口的comparTo()方法。

2,  創建比較器。比較器實現Compartor接口,Compar()方法作爲TreeSet對象的構造參數象傳入。注意泛型。

3,  建議用第二種,使用靈活

·   publicstaticvoid main(String[] args) {

      TreeSet  <Person>ts= newTreeSet<Person>(new Comparator<Person>() {

 

            publicint compare(Person o1, Person o2) {

            return o1.getAge()-o2.getAge();

         }

      });     

      ts.add(new Person("mike",28));

      ts.add(new Person("lisi",21));

      ts.add(new Person("zhouqi",29));

      ts.add(new Person("zhaoliu",25));

      ts.add(new Person("wangu",24));

      for (Object o: ts) {

         Person p = (Person) o;

         System.out.println(p.getName() +"\t" + p.getAge());

      }    

     

}

 

 

3.5. 選擇HashSet還是TreeSet?

HashSet的性能總是比TreeSet好,(主要表現在添加、刪除、查詢等),因爲TreeSet需要二外的紅黑樹來維護次序。只有當需要排序時才使用TreeSet

HashSet有一個子類,LinkedSet對於普通測插入刪除這個要比HashSet要慢些。因爲要維護鏈表。

 

3.6. 安全問題解決

通常在創建是就調用Collections工具類的synchronizedSortedSet方法來包裝集合。

例如

       Sorted s =new Collections.synchronizedSortedSet(new Treeset(…))

 

4.       Map集合

Map集合用於存儲那些有映射關係的數據;

Map也成爲雙列集合。

Map存的是一對元素:一個Key,一個ValueKeyValue可以使任何引用類型的數據。其中MapKey不允許重複。

4.1.Map集合子體系

Map:

       |----HashMap:哈希表結構;Key唯一;不同步;允許null作爲鍵,值。hashCode()equals()確定唯一

       |----HashTable:哈希表結構;數據唯一;同步低效的。不允許null作爲鍵,null作爲值。

       |----TreeMap:二叉樹結構;Key唯一;可排序;不同步但高效;允許null作爲鍵,null作爲值。

 

補充:

4.2.Map常用方法

1添加元素:

              ·value put(key,value):           返回前一個和key關聯的值,如果沒有返回null.

2,刪除元素。

              void  clear():            清空集合。

              value remove(key):           根據指定的key翻出這個鍵值對。

3,判斷元素。

              boolean containsKey(key):     判斷是否包含給定的key

              boolean containsValue(value):判斷是否包含給定的value

              boolean isEmpty();           判斷集合是否爲空

4獲取元素。

              value get(key):          通過鍵獲取值,如果沒有該鍵返回null。可以用來來判斷是否包含指定鍵。

              int size():     獲取鍵值對的個數。

4.3.CollectionCollections

collection是集合框架的頂層接口,集成了一些集合的共性方法;添加、刪除、修改、查詢、判斷等。下分爲listset兩個分支,其又各自有體系,其

list有序,可以重複的,有分爲vector arraylistlinkedlist(各個數據結構,特點)

其中set是無序不許重複的,有分爲。hashsettreeset(各個數據結構,特點)

 

Collections是一個對collection操作的工具類,提供的都是靜態方法(查找,排序,反轉,加鎖)


出處http://blog.csdn.net/bondsui

發佈了16 篇原創文章 · 獲贊 17 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章