JavaSE筆記--集合框架
List(有序) | Set(無序、不重複) | Map | |||||
ArrayList | LinkedList | Vector | HashSet | TreeSet | HashMap | Hashtable | TreeMap |
基於陣列 | 基於連結串列 | 基於陣列 | 基於雜湊表 | 基於二叉數 | 基於雜湊表 | 基於雜湊表 | 基於紅黑樹 |
尾部追加查詢快,中間插入刪除慢 | 尾部追加和查詢慢,中間插入刪除快 | 與ArrayList一樣,但多執行緒同步 | 以hashcode碼為標識,效能優於TreeSet適合快速查詢 | 需要排序時使用 | Map中插入、刪除和定位元素 | 效率沒HashMap高,但執行緒同步 | 按自然循序或自定義順序遍歷鍵 |
允許為空 | 允許為空 | 允許為空 | 允許有一項為空 | 不允許為空 | 允許一項為空 | 不允許為空 | 不允許為空 |
0.引言
資料結構是以某種形式將資料組織在一起的集合。資料結構不僅儲存資料,還支援那些訪問和處理的操作。比如ArrayList它是一種將資料儲存線上性表中的資料結構,另外Java還提供了能有效地組織和操作資料的資料結構,這些資料結構通常稱之為Java集合框架(Java Collections Framework)。
在面對物件思想裡,一種資料結構被稱之為一個容器,它是一個能儲存資料或者元素的物件。定義一種資料結構從本質上講就是定義一個類,資料結構類應用使用資料域儲存資料,並提供方法支援查詢、插入和刪除等操作。因此建立一個數據結構就是建立這個類的一個例項。然後用這個例項上的方法操作這個資料結構。
集合框架支援兩種型別的容器:儲存一個元素集合,簡稱集合(collection)和儲存鍵值對,稱之圖(map)。
1.集合
集合(Collection)包括三種類型:規則集(Set)、線性表(List)、佇列(Queue)。Set例項用於儲存一組不重複的元素,List的例項用於儲存一個由元素構成的有序集合,Queue的例項用於儲存用先進先出方式處理的物件。這些集合的特性都被定義在介面中,而它的實現是在具體類中提供的。
Collection介面是util包下的,所以在使用Collection下的方法要導util包,提供了具體的子介面(List和Set)。Collections有一個方法可對元素排序sort(List list);
主要方法:
boolean add(E e)新增
boolean clear()清除
boolean isEmpty()判斷容器是否包含元素
boolean remove(Object o)在此collection中移除指定元素
Iterator<E> iterator()返回在此collection的元素上進行迭代的迭代器
int size()返回此collection中的元素數
2.子介面 List<E> extends Collection<E>:有序,可重複
新增方法:
void add(int index,E element) 在列表的指定位置插入指定元素
E get(int index)返回列表中指定位置的元素
E remove(int index)移除列表中指定位置的元素
E set(int index,E element)用指定元素替換列表中指定位置的元素
Object[] toArray()返回按適當順序包含列表中所有元素的陣列
1). ArrayList<E>類實現List<E>介面:基於陣列,尾部追加查詢快,中間插入刪除慢,允許為空
常用方法:
ArrayList()構造一個初始初始為10的空列表
ArrayList(Collection<? extends E> c)構造一個包含指定collection的元素列表
ArrayList(int initialCapacity)構造一個具有指定初始容量的空列表
void trimToSize()將此ArrayLIst例項的容量調整為列表的當前大小
例項
package com.example.test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Demo01 { public static void main(String[] args) { List list=new ArrayList(); list.add("hello"); list.add(12); list.add(true); list.add(1,"world");//輸出helloworld12true list.set(0, "hello1");//輸出hello1world12true list.remove(1);//輸出hello112true for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i));; } System.out.println(); list.clear(); list.add("hello2"); list.add(11); list.add(false); //迭代器的使用 Iterator it=list.iterator();//it先指向第一個元素的前面 while(it.hasNext()){//再判斷是否有下一個元素 Object obj=it.next();//有取得下一個元素 System.out.print(obj); } } }
輸出:
2).LinkedList<E>實現List<E>介面:基於連結串列,尾部追加和查詢慢,中間插入刪除快
方法與ArrayList相同
3).Vector 底層基於陣列的實現,是同步的(在多執行緒環境安全)
方法與ArrayList相同
2.子介面 Set<E> extends Collection<E>:無序,不能出現重複元素,至多包含一個null元素
1).HashSet<E>實現Set<E>介面,基於雜湊碼(HashCode),允許有一項為空
例項:package com.example.test;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Demo02 {
public static void main(String[] args) {
Set set=new HashSet();
set.add("hello");
set.add(12);
set.add(null);
set.add(true);
set.add(null);//只輸出一個null,不會報錯
Iterator it=set.iterator();
while(it.hasNext()){
Object obj=it.next();
System.out.print(obj);
}
}
}
輸出2).TreeSet<E>實現Set<E>介面,基於樹的實現,不允許出現為空,並插入的型別一致,不然會報錯
3.圖
圖是一種依照鍵值儲存元素的容器,鍵值很像下標。在List中,下標是整數,在Map中,鍵值可以是任意型別的物件。圖中不能有重複的鍵值,每個鍵值都對應一個值,一個鍵值和它的對應值構成一個條目,真正在圖中儲存的是這個條目。
圖的型別有三種:雜湊圖HashMap、鏈式雜湊圖LinkedHashMap和樹形圖TreeMap。
常用方法:
void clear() 從此對映中移除所有對映關係
V get(Object key) 返回指定鍵所對映的值,沒有返回null
Set<K> keySet()返回此對映中包含的鍵的Set檢視,就是得到所有的key
V put(K key,V value)將指定的值與此對映中的指定鍵關聯
V remove(Object key)如果存在一個鍵的對映關係,將其移除
int size()返回此對映中的鍵值對映關係數
Collection<V> values()得到所有的值
1).HashMap<K,V>實現Map<K,V>介面,基於雜湊碼,允許有一項為空,不同步
2).TreeMap<K,V>實現Map<K,V>介面,基於紅黑樹,不允許為空
3).Hashtable<K,V>實現Map<K,V>介面,底層基於雜湊表,是同步的
例項:
package java0401; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; public class Demo01 { public static void main(String[] args) { //Map map=new HashMap(); Map map=new TreeMap(); map.put(1001, "tom"); map.put(1002, 123); map.put(1003, null); Set<Map.Entry> set=map.entrySet(); for (Map.Entry entry : set) { System.out.println(entry.getKey()+":"+entry.getValue()); } //圖的遍歷 /*Set set=map.keySet(); Iterator it=set.iterator(); while(it.hasNext()){ System.out.println(it.next()); }*/ //獲得所有的VALUE /* Collection cl=map.values(); Iterator it=cl.iterator(); while(it.hasNext()){ System.out.println(it.next()); }*/ //map.clear(); //map.remove("hello"); //System.out.println(map.get("hello"));//得到hello對映的值,沒有返回NULL } }
結果