Java初級筆記_集合_2

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------

一、Set(掌握)

(1)Set集合的特點:

無序(存儲和取出的順序不一致),唯一。

(2)HashSet

如何保證元素的唯一性呢?

底層數據結構是哈希表。哈希表依賴於哈希值

最終依賴兩個方法hashCode()和equals()。

順序:

先比較hashCode()值:

相同:

繼續走equals()方法,根據返回值:

true:說明元素重複。不添加。

false:說明元素不重複,添加。

不同:就直接添加到集合。

案例:

HashSet存儲字符串並遍歷。(String類重寫了hashCode()和equals())

HashSet存儲自定義對象並遍歷。

存儲Person對象,然後去掉重複值。(標準代碼)

(3)TreeSet(理解)

如何保證元素的唯一性?

根據返回值是否是0。

如何保證元素的排序?

A:自然排序(元素具備比較性)

讓元素所屬的類實現Comparable接口

重寫compareTo(T t)

B:比較器排序(集合具備比較性)

在創建集合對象的時候,傳遞Comparator接口的子類對象

重寫compare(T t,T t2)

案例:

TreeSet存儲字符串並遍歷。(String實現了Comparable接口)

         TreeSet存儲自定義對象並遍歷。   

(標準代碼 看懂就行)
存儲學生對象,要求保證唯一和排序(先比較年齡,再比較姓名)。
    
        

(4)LinkedHashSet:(理解)

底層數據結構是哈希表和鏈表。

由哈希表保證元素唯一。

由鏈表保證元素有序。

    二、增強for(掌握)

(1)是針對數組和Collection集合進行遍歷的一種方式。

(2)格式:

for(數組或者Collection集合中的元素的數據類型 變量名 : 數組或者Collection集合對象) {
直接使用變量名即可,這個時候的變量名其實就是元素。
}

(3)注意:

A:增強for的底層封裝了迭代器的操作。

B:在使用增強for的時候,請保證迭代目標不爲null。

C:增強for循環只能做展示數據的功能,不能修改數據。

    三、Map集合(掌握)

(1)Map集合存儲的是鍵值對元素。鍵是唯一的,值可以重複。

(2)Map和Collection的區別?

A:Map是雙列集合,存儲的元素鍵值對,鍵唯一,值可以重複。

B:Collection是單列集合,存儲的元素是單一的,List集合可以重複,Set集合元素唯一。

(3)Map集合的功能

A:添加功能

V put(K key,V value)

B:刪除功能

remove(K key)

C:判斷功能

containsKey(K key)

containsValue(V value)      

D:獲取功能

V get(K key)

Set<K> keySet()

Collection<V> values()

Set<Map.Entry<K,V>> entrySet()

Map.Entry:

getKey

getValue

E:長度

int size()

(4)Map集合的數據結構問題:

Map集合的數據結構對鍵有效,跟值無關。

它的底層數據結構和Set中講解的一致。

如果是哈希表結構,就需要重寫hashCode()和equals()。

如果是二叉樹結構,就有兩種方式:Comparable,Comparator

(5)Map的遍歷方式

假設有一個HashMap集合,存儲的鍵和值都是String類型。名稱叫hm。

A:根據鍵找值(掌握)

a:獲取所有鍵的集合

b:遍歷鍵的集合,獲取到每一個鍵

c:根據鍵找值

代碼體現:

Set<String> set = hm.keySet();
for(String key : set) {
String value = hm.get(key);
System.out.println(key+"---"+value);
}

B:根據鍵值對對象找鍵和值(理解)

a:獲取所有鍵值對對象的集合

b:遍歷鍵值對對象的集合,獲取到每一個鍵值對對象

c:根據鍵值對對象獲取鍵和值

代碼體現:

Set<Map.Entry<String,String>> set = hm.entrySet();
for(Map.Entry<String,String> me : set) {
String key  = me.getKey();
String value = me.getValue();
System.out.println(key+"---"+value);
}

(6)案例:

A:統計一個字符串中每個字符出現的次數

B:Map集合的嵌套存儲和遍歷

(7)Map集合的體系

Map
|--HashMap
|--LinkedHashMap
|--Hashtable
|--TreeMap

    四、其他

1:五種數據結構

數組:長度固定,有序,查找方便

鏈表:添加刪除方便

棧:先進後出

隊列:先進先出

樹結構:完成排序動作

2:泛型(瞭解)

(1)是一種把明確數據類型的工作推遲到創建對象或者調用方法的時候採取明確的特殊的類型。

(2)格式:

<數據類型>

默認情況下,泛型是Object類型。

(3)好處:(理解)

A:優化了程序的設計。

B:把運行期的問題提前到了編譯期。

C:避免了強制類型轉換。

(4)泛型體現:

A:泛型類 把泛型定義在類上

B:泛型接口 把泛型定義在接口上

C:泛型方法 把泛型定義在方法上

(5)泛型通配符

表示任意類型<?>。可以用來規定類型上下邊界。

最常見的就是在集合中使用。並且是看到帶有<>

3:靜態導入

import static 包.包.類.靜態成員;

4:可變參數

格式:方法名(參數類型... 變量名)

本質:將參數轉成數組再進行操作

5:Arrays與Collections

數組與集合工具類

    五、集合總結

     是否鍵值對:

是:Map

是否排序:

是:TreeMap
否:HashMap

不知道,HashMap

否:Collection    

是否唯一:

是:Set

是否排序:
是:TreeSet
否:HashSet
不知道,HashSet

否:List

增刪多:LinkedList

查詢多:ArrayList

不知道,ArrayList

   不知道,用ArrayList

集合體系總結
集合:
|--Collection
|--List
|--ArrayList
底層數據結構是數組,查詢快,增刪慢。
線程不安全,效率高。
|--Vector
底層數據結構是數組,查詢快,增刪慢。
線程安全,效率低。
|--LinkedList
底層數據結構是鏈表,查詢慢,增刪快。
線程不安全,效率高。
|--Set
|--HashSet
底層數據結構是哈希表。
如何保證唯一性?
依賴hashCode()和equals()
順序:
先判斷hashCode()值是否相同:
是:繼續走equals(),看返回值
true:元素重複。不添加
false:元素不重複。添加
否:直接添加
|--LinkedHashSet
底層數據結構是鏈表和哈希表。
由鏈表保證有序(存儲和取出一致)。
由哈希表保證元素唯一。
|--TreeSet
底層數據結構是二叉樹。
如果保證唯一性?
根據返回值是否是0。
如何排序:
自然排序:Comparable
比較器排序:Comparator
|--Map
|--HashMap
|--LinkedHashMap
|--Hashtable
|--TreeMap





------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章