1. 程式人生 > >淺談集合

淺談集合

linked .com ont queue接口 ron hash 取數 後進先出 循環

1.集合和數組的區別

集合:長度可變,可以存放不同類型的元素,只能存放引用類型
數組:長度固定,只可以存放相同的同種類型的元素,可以存放數據類型也可以存放引用類型

2.java工具類 如下圖:

.技術分享技術分享

3.List、Set、Map是這個集合體系中最主要的三個接口。List和Set繼承自Collection接口。 Map也屬於集合系統,但和Collection接口不同。

1.Set不允許元素重復。HashSet和TreeSet是兩個主要的實現類。Set只能通過遊標來取值,並且值是不能重復的。
2.List有序且允許元素重復。ArrayList、LinkedList和Vector是三個主要的實現類。ArrayList 是線程不安全的, Vector 是線程安全的,這兩


個類底層都是由數組實現的 LinkedList 是線程不安全的,底層是由鏈表實現的
3.Map 是鍵值對集合,其中key列就是一個集合,key不能重復,但是value可以重復。HashMap、TreeMap和Hashtable是Map的三個主要的實現類。
HashTable 是線程安全的,不能存儲 null 值 HashMap 不是線程安全的,可以存儲 null 值

4..Collection 集合接口(沒有獲取元素的方法,在其子類中有)(主要說上圖帶有紅框的部分)

Collection中的存放的數值可以重復,有序

List 和 Set接口繼承Collection接口,

LIst接口可以由Vector,ArrayList,LinkedLIst實現

Set接口可以由HashSet,SortedSet實現

  • Collection 中的主要方法有(前者為返回值類型,後面是方法)(紅色的為重要的方法)

  1. boolean add(Object element):向此collection中添加元素

  2. Int size():返回此collection中的元素個數(或者是集合的長度)

  3. boolean isEmpty():判斷此collection中是否包含元素

  4. boolean contains(Object obj):判斷此collection是否包含指定的元素

  5. boolean containsAll(Collection c):判斷此collection是否包含指定collection中的所有元素

  6. boolean addAll(Collection c):將指定collection中的所有元素添加到此collection中

  7. boolean remove(Object element):從此collection中移除指定的元素(第一個與之匹配的數值)

  8. boolean removeAll(Collection c):移除此collection中包含在指定collection中的所有元素

  9. void clear():移除collection中所有的元素

  10. boolean retainAll(Collection c); 僅保留此collection中和指定collection的交集元素

  11. Iterator iterator():返回此collection元素的叠代器

  12. Object[] toArray():把此collection轉成數組

  • List集合的主要方法(Collection接口中存在的方法,list接口可調用)還額外擴充了一些常用方法:

  1. Object get(int index) 獲取指定位置索引的元素

  2. void add(int index, Object element);在指定位置插入指定元素,其他元素依次後移

  3. Object set(int index, Object element) 用指定元素替換指定位置的元素

  4. List subList(int fromIndex, int toIndex) 返回列表中指定的fromIndex(包括 )和 toIndex(不包括)之間的部分列表

  5. int indexOf(Object o) 根據元素獲得索引;如果此列表不包含該元素,則返回 -1。(從左到右的第一個元素)

  6. int lastIndexOf(Object o)根據元素獲得索引;如果此列表不包含該元素,則返回 -1。(從右到坐的第一個元素)
  • ArrayList是List接口的實現類,底層使用數組結構實現(調用的方法可以在List中找)在這裏說Arraylist的三種遍歷方式

  • 先創建一個集合

技術分享

  1. 使用索引遍歷

技術分享

2.使用Object類型的遍歷

技術分享

3.叠代器遍歷

//hasNext()判斷是否有下一個元素

//next()獲取下一個元素

技術分享

ArrayList排序

想要實現排序,集合中所存放的數據類型
這個類必須實現compareto接口(重寫compareto方法)

在Java中數組排序的方法是java.util.Arrays.sort(數組)

  • LinkedList是List接口的另一個常用實現類,底層使用雙向鏈表實現

  • LinkedList除了實現List接口外,還實現了Queue接口,並提供了對列表開頭、結尾操作的方法,使得LinkedList具有棧、隊列的雙重特點。

  • 棧:後進先出,LastInFirstOut,LIFO

  • 入棧 push()(添加元素);出棧 pop()(刪除棧頂元素)(彈棧);
  • 隊列:後進後出,LastInLastOut,LILO

  • 入隊 offer()(添加元素); 出隊poll()(刪除隊首元素);
  1. add() 添加元素 addLast()在此時的隊尾添加元素 addfirst() 在此時的隊首添加元素
  2. offerLast() 在此時的隊尾添加元素
  3. get(int index):返回此列表中指定位置處的元素 getFirst():返回此列表的第一個元素 getLast():返回此列表的最後一個元素
  4. peek():獲取但不移除此列表的頭(第一個元素)
  5. peekFirst():獲取但不移除此列表的第一個元素 peekLast():獲取但不移除此列表的最後一個元素
  6. pollFirst():獲取並移除此列表的第一個元素 pollLast():獲取並移除此列表的最後一個元素

ArrayList和LinkedList對比
1.查找元素時,ArrayList效率高
2.進行插入和刪除元素時,LinkedList效率高

5.Set接口:set中存放的元素是無序的(存放順序)無重復數據 無獲取索引的方法

Set接口常用實現類:

HashSet: 不記錄添加數據的順序,且加入的元素不能重復,否則覆蓋。(基於哈希散列,Set存、取、刪 都有較高的效率

加入HashSet集合的自定義類型的對象通常需要重寫hashCode()和equals()方法。通過hashcode()獲取到任何一個對象的哈希碼值

hashCode()用於判斷是否是同一類型的,equals()標記,根據哪個屬性排序

TreeSet 同樣不記錄添加數據的順序,但是可以對存入的元素進行排序(基於紅黑樹實現),輸出也會按照排序後的順序 (排好序的)

LinkedHashSet 根據元素的哈希碼進行存放,同時用鏈表記錄元素的插入順序(有序的:存取數據的位置無變化)

set常用的方法:

add()添加

remove()刪除

clear()清空

6.Map接口:Map接口用來存儲“鍵-值”映射對

Map中存儲的“鍵-值”映射對是通過鍵來唯一標識,Map的“鍵”底層采用Set來存放。 因此,存入Map中的“鍵”如果是自定義類,應該重寫hashCode()和equals()方法,確保鍵的唯一 常用String作為Map的"鍵"。

1.常用的方法

put(K key, V value):將指定的"鍵-值"對存入Map中

get(Object key):返回指定鍵所映射的值

int size():獲得此Map中"鍵-值"對的數量

remove(Object key):根據指定的鍵把"鍵-值"對從Map中移除

*boolean containsKey(Object key):判斷Map是否包含指定的鍵

*boolean containsValue(Object value):判斷此Map是否包含指定的值

boolean isEmpty():判斷此Map中是否有元素

void clear():清空Map中的所有"鍵-值"對

Set<K> keySet():返回此Map中包含的鍵的Set集合。

Collection<V> values():返回Map中包含值的Collection集合

replace(Object key,Object values)替代指定key值得values值

2.HashMap內部對“鍵”使用Set進行散列存放。因此,根據“鍵”取“值”的效率較高,也是Map接口使用頻率較高的一個實現類。

①通過key值 獲得value值

獲取集合中所有key值(get)

技術分享

用foreach語句循環遍歷key值 得到value值

技術分享

②獲取集合總所有value值

技術分享

③獲取map集合中成對的數據

技術分享

Map.Entry是Map內部定義的一個static接口,專門用來保存key-value對的內容。

通過entrySet()方法取到Entry對象,然後使用getKey(),getValue()獲取鍵、值 一般情況下,map多用於存放、查找數據,遍歷輸出的情況較少。

3.TreeMap

TreeMap內部使用紅黑樹結構對“key”進行排序存放,所以放入TreeMap中的“key-value”對的“key”必須是“可排序”的

4.區別

HashMap的鍵采取哈希值存儲,不記錄元素插入的位置,也不排序

TreeMap的鍵采取紅黑樹存儲,不記錄元素插入的位置,但是可以排序

LinkedHashMap的鍵采取哈希值存儲,並使用鏈表記錄元素插入的位置,不排序

5.選擇使用集合

存放要求
無序,無下標,不可重復,不能隨機訪問-Set
有序,有下標,可重復,可以隨機訪問-List
“key-value”對,較多存放,較少遍歷-Map
讀和改(插入刪除)的效率
Hash-兩者都較高
ArrayList-讀(指定下標隨機訪問)快,插入/刪除元素慢
LinkedList-讀(指定下標隨機訪問)慢,插入/刪除元素快

//^_^本人新人,以上是上課記得筆記和自己的理解,如有異議,歡迎一起討論

淺談集合