淺談集合
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 中的主要方法有(前者為返回值類型,後面是方法)(紅色的為重要的方法)
-
boolean add(Object element):向此collection中添加元素
-
Int size():返回此collection中的元素個數(或者是集合的長度)
-
boolean isEmpty():判斷此collection中是否包含元素
-
boolean contains(Object obj):判斷此collection是否包含指定的元素
-
boolean containsAll(Collection c):判斷此collection是否包含指定collection中的所有元素
-
boolean addAll(Collection c):將指定collection中的所有元素添加到此collection中
-
boolean remove(Object element):從此collection中移除指定的元素(第一個與之匹配的數值)
-
boolean removeAll(Collection c):移除此collection中包含在指定collection中的所有元素
-
void clear():移除collection中所有的元素
-
boolean retainAll(Collection c); 僅保留此collection中和指定collection的交集元素
-
Iterator iterator():返回此collection元素的叠代器
-
Object[] toArray():把此collection轉成數組
-
List集合的主要方法(Collection接口中存在的方法,list接口可調用)還額外擴充了一些常用方法:
-
Object get(int index) 獲取指定位置索引的元素
-
void add(int index, Object element);在指定位置插入指定元素,其他元素依次後移
-
Object set(int index, Object element) 用指定元素替換指定位置的元素
-
List subList(int fromIndex, int toIndex) 返回列表中指定的fromIndex(包括 )和 toIndex(不包括)之間的部分列表
-
int indexOf(Object o) 根據元素獲得索引;如果此列表不包含該元素,則返回 -1。(從左到右的第一個元素)
- int lastIndexOf(Object o)根據元素獲得索引;如果此列表不包含該元素,則返回 -1。(從右到坐的第一個元素)
-
ArrayList是List接口的實現類,底層使用數組結構實現(調用的方法可以在List中找)在這裏說Arraylist的三種遍歷方式
- 先創建一個集合
-
使用索引遍歷
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()(刪除隊首元素);
- add() 添加元素 addLast()在此時的隊尾添加元素 addfirst() 在此時的隊首添加元素
- offerLast() 在此時的隊尾添加元素
- get(int index):返回此列表中指定位置處的元素 getFirst():返回此列表的第一個元素 getLast():返回此列表的最後一個元素
- peek():獲取但不移除此列表的頭(第一個元素)
- peekFirst():獲取但不移除此列表的第一個元素 peekLast():獲取但不移除此列表的最後一個元素
- 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-讀(指定下標隨機訪問)慢,插入/刪除元素快
//^_^本人新人,以上是上課記得筆記和自己的理解,如有異議,歡迎一起討論
淺談集合