Java集合框架知識總結
兩大體系:Collection,Map
一、Collection:
List 接口 :
List:裏面對象全部是有序的(通過三種方法來遍歷)
ArrayList,LinkedList,Vertor
ArrayList:本質上 ArrayList 裏維護的就是動態可變長度的數組。
常用方法:
增:add(4) 對象 位置+對象 集合 集合+位置。
刪:remove(2)下標刪對象,直接刪對象。
改:set(1) 下標 對象。
查:get() 下標得對象, indexOf()對象得下標。
contains()必須是同一個對象才返回true iterator() size()。
LinkedList:本質上 LinkedList 裏維護的是動態可變長度的雙向鏈表
常用方法:
增:add(4) 對象 位置,對象 集合 位置,集合 +2(對象) 新增:addFirst() addLast()。
刪:remove(2)下標刪對象,直接刪對象 +2(對象) 新增:removeFirst() removeLast()。
改:set(1) 下標 對象
查:get() 下標得對象 indexOf()對象得下標 +2(對象) 新增:getFirst() getLast()。
contains() iterator()size()。
Vertor:線程安全,執行效率非常低
常用方法:
增:add(4) 對象 位置,對象 集合 位置,集合 addElement(對象) insertElement(對象)。
刪:remove(2)下標刪對象,直接刪對象 removeElement(對象) removeAllElment()。
改:set(1) 下標,對象 setElementAt(對象,下標)。
查:get() 下標得對象 indexOf()對象得下標。
contains() iterator() size()。
iterator() :hasNext()判斷有沒有下一個元素。
next()獲取下一個元素。
remove()在叠代器中移除元素。
Set接口:
不允許出現重復的方法,允許有一個null值,都沒有順序索引(通過增強for循環和叠代來遍歷),所以查不了,改不了。
要想存入Set,必須重寫equals()和hashCode()方法(String已經重寫),兩者返回值都為真表明相等,比的是內容。
其實一個equals()就可以,但是當存入數據量大的時候,一一比較效率非常低,加入hashCode,就是來判斷不是同一個對象的。
用hashCode()無法判斷是同一個對象。
因為所有的已經存入的對象保存在一個table裏面,比較的效率非常高。
如果已存在,是不能再往裏面添加(而Map是後面覆蓋前面)。
HashSet:
內部維護的是HashMap的一個實例,存的是key的集合。
元素的表現是無序的,但一旦添加完元素,元素位置是固定的(也就是說你無論再運行多少遍,這個顯示的順序都一樣),再添加新元素,不會影響前面元素的位置,給添加的元素分配位置,只要不打亂前面的元素位置,前面的元素位置就不會再發生變化。
常用方法:
增:add(對象)。
刪:clear()移除所有對象 ,remove(對象)。
改:沒有,沒下標。
查:除了遍歷出所有,沒有,因為沒有下標。
contains()內容相同就返回true iterator() size()。
LinkedHashSet:
HashSet的子類,只有四個新增的構造器,沒有其他新增方法,內部維護的是LinkedHashMap的一個實例,是雙向鏈表結構。
元素存放順序和叠代順序一樣(按順序)。
常用方法同HashSet。
TreeSet:
確保元素處於排序狀態,底層為樹結構。使用它可以從Set中提取有序的序列。
兩種排序方法:自然排序和定制排序,默認采用自然排序。
自然排序:會調用集合元素的comparaTo(對象)方法來比較元素之間的大小關系,然後把集合按升序排列(實現 Comparable接口)。
定制排序:通過Comparator(比較器)接口,需要重寫compara(對象,對象),要實現定制排序,需要把comparator實例作為形 參傳給TreeSet的構造器。
要想把元素放到TreeSet中,必須實現Comparable接口,同時必須實現comparaTo方法。
或者繼承Comparator接口,然後重寫compara方法。
first() last()lower(對象) heigher(對象) 其他視圖方法。
二、Map集合:維護"鍵值對"的關聯性
key,value 必須都為引用類型數據
key不可以重復(後覆蓋先),保存在Set集合中(因為Set集合裏面的元素不能重復,所以,,還必須重寫equals和hashCode()方法),經常用String,因為都已經實現
put(key,value) remove(key) putAll(Map map) clear()清除所有 。(基本全是通過Set,也就是key,唯一性)。
獲取key的集合:
Set<> set= map.keySet();Iterator<> it=set.iterator();get(key) 叠代器。
獲取value的集合:
Collection values() 叠代器,增強for都可以。
Entry集合:
Set<Entry<,>> entrys = map.entrySet();
for(Entry<String,String> entry : entrys)叠代器,增強for都可以
get(key) containsKey(key) containsValue(value) size isEmpty() equals()比較的當然是內容啦
HashMap:
允許key和value的值為null。
表現是無序的 比較key相等和Set一樣。
LinkedHashMap:子類,有序的(等同上面的HashSet和LinkedHashSet)只比HashMap慢一點。而在叠代訪問時發而更快,因為它使用鏈表維護內部次序。
TreeMap:
有序。 基於紅黑樹數據結構的實現。查看"鍵"或"鍵值對"時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。
HashTable:
最古老,不允許key和value值為null
Properties:
是HashTable的子類,用來處理文件的屬性。
文件屬性必須是key_value,必須都是字符串,存取數據用put(key,value),get(key)。
Collections:
集合操作類
排序:
Collections.reverse(list) 反序
Collections.shuffle()隨機
Collections.sort()自然順序升序
Collections.swap(對象,位置,位置)交換
查找:
max()
min()frequency(Collections,對象);
copy(目標list,srclist)
Collections.repalceAll(list,old對象,new對象)
synchronizedXXX();
synchronizedList(list)
總結:
1.線程安全的是vertor和HashTable。
2. List:允許重復的,全部有序(允許null)。
3.Set: HashSet無序的表現(一個null),其中HashSet的子類LinkedHashSet有序,TreeSet有序。
4.Map:HashMap無序的表現(一次null),其中HashMap的子類LinkedHashMap有序,TreeMap有序,HashTable無序(不能為null)。
5.ArrayList:查詢效率高,增刪效率低。
6.LinkedList:查詢效率低,增刪效率高。
7.Vertor:執行效率非常低。
8.HashSet:良好的增刪查詢性能。
9.LinkedHashSet:查詢效率低,插入效率比HashSet低。
10.Map對象高於List。因為Map除了Value外還需要一個Object的Key,從而增大了Map的容量。
11. HashSet,HashMap的元素都是無序的,而他們的子類都是有序的,雙向鏈表,非常類似,因為HashMap中的唯一的約束就是key,而 key恰恰是被HashMap維護的
12.TreeSet和TreeMap都是有序的,兩個很類似。
13. 如果Map知道了Key,List知道了index,其性能在一百萬條數據中無多大差別。
14.List按對象進入的順序保存對象,不做排序或編輯操作。Set對每個對象只接受一次,並使用自己內部的排序方法(通常,你只關心某個元素是否屬於 Set,而不關心它的序 否則應該使用List)。Map同樣對每個元素保存一份,但這是基於"鍵"的,Map也有內置的排序,因而不關心元素添加的 順序。如果添加元素的順序對你很重要,應該使用 LinkedHashSet或者LinkedHashMap。
15.HashMap就是使用對象的hashCode()進行快速查詢的。此方法能夠顯著提高性能。
舉個簡單的例子:
import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class TestHashMap { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); // put()往Map中添加一個元素(Key-Value) map.put("5", "ddd"); map.put("1", "aaa"); map.put("2", "bbb"); map.put("3", "ccc"); map.put("4", "ccc"); // HashMap的遍歷 Set<String> keys = map.keySet(); Iterator<String> it = keys.iterator(); // Iterator<String> it = map.keySet().iterator(); System.out.println("-----------HashMap的遍歷方法一-------------"); System.out.println("-----------map.keySet()-------------"); while (it.hasNext()) { String key = it.next(); // get返回指定key對應的value System.out.println(key + " : " + map.get(key)); } Collection<String> c2=map.values(); for(String str:c2){ System.out.println(str); } Set<Entry<String,String>> entrys = map.entrySet(); System.out.println("-----------HashMap的遍歷方法三-------------"); System.out.println("-----------map.entrySet()-------------"); for(Entry<String,String> entry : entrys){ System.out.println(entry.getKey() + " : " + entry.getValue()); } System.out.println("-------------"); //remove方法移除指定key對應的元素,返回對應的value System.out.println(map.remove("4")); // //如果key不存在,返回null,移除操作無效 System.out.println(map.remove("9")); System.out.println("-----------map.remove()之後-------------"); it = map.keySet().iterator(); while(it.hasNext()){ String key = it.next(); //get返回指定key對應的value System.out.println(key + " : " + map.get(key)); } // //判斷Map中是否存在指定key System.out.println(map.containsKey("1")); System.out.println(map.containsKey(new String("1"))); //判斷Map中是否存在指定Value System.out.println(map.containsValue("aaa")); System.out.println(map.containsValue(new String("aaa"))); } }
僅僅總結了常用的集合。
Java集合框架知識總結