1. 程式人生 > >Java 集合類概述

Java 集合類概述

java.util包中提供了一些集合類,這些集合類又被稱為容器。集合類與陣列的不同之處是,陣列的長度是固定的,集合的長度是可變的;陣列用來存放基本型別的資料,集合用來存放物件的引用。常用的集合有List集合和Map集合,其中List與Set繼承了Collection介面,各介面還提供了不同的實現類。上述集合類的繼承關係如圖所示:

List、Set、Map區別

List(有序,可重複):List裡存放的物件是有序的,同時也是可以重複的,List關注的是索引,擁有一系列和索引相關的方法,查詢速度快。因為往list集合裡插入或刪除資料時,會伴隨著後面資料移動,所以插入刪除資料慢。

Set(無序,不能重複):Set裡存放的物件是無序,不能重複的,集合中的物件不按特定的方式排序,只是簡單地把物件加入集合中。

Map(鍵值對,鍵唯一,值不唯一):Map集合中儲存的是鍵值對,鍵不能重複,值可以重複。根據鍵得到值,對Map集合,遍歷的先得到鍵的Set集合,對Set集合進行遍歷得到相應的值。

Collection介面

collection介面是層次結構中的根介面。構成Collection的單位稱為元素。Collection介面通常不直接使用,但該介面提供了新增元素、刪除元素、管理資料的方法。由於List介面與Set介面都繼承了Collection介面,因此這些方法對於List集合和Set集合都是通用的,如下表所示:

方法 功能描述
add(E e) 將指定的物件新增到集合中
remove(Object o) 將指定的物件從該集合中移除
isEmpty() 返回boolean值,用於判斷當前集合是否為空
iterator() 返回在此Collection的元素上進行迭代的迭代器。用於遍歷集合中的物件
size() 返回int型值,獲取該集合中元素的個數

集合是通過迭代器進行遍歷,如下所示:

package set;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Collection<String> list=new ArrayList<String>(); //例項化集合類物件
		list.add("a");
		list.add("b");
		list.add("c");
		Iterator<String> it=list.iterator();  //建立迭代器
		while(it.hasNext()){
			String str=(String)it.next();  //獲取集合中的元素
			System.out.println(str);
		}
	}

}

執行結果:

a
b
c

Iterator的next()方法返回的是Object。

List集合

List集合包括List介面以及List介面的所有實現類。List集合中的元素允許重複,各元素的順序就是物件插入的順序。類似Java陣列,使用者可通過使用索引(元素在集合中的位置)來訪問集合中的元素。

List介面

List介面繼承了Collection介面,因此包含Collection中的所有方法。此外,List介面還定義了以下兩個重要的方法:

get(int index):獲得指定索引位置的元素。

set(int index,Object obj):將集合中指定索引位置的物件修改為指定的物件。

List介面的常用的兩個實現類有ArrayList與LinkedList。

區別

ArrayList類實現了可變的陣列。允許儲存所有的元素,包括null,並可以根據索引位置對集合進行快速的隨機訪問;缺點是向指定的索引位置插入物件或刪除物件的速度較慢。

LinkedList類採用連結串列結構儲存物件。這種結構的優點便是便於向集合中插入和刪除物件,需要向集合中插入、刪除物件時,使用LinkedList類實現的List集合的效率較高;但對於隨機訪問集合中的物件,使用LinkedList類實現List集合的效率較低。

下面用程式碼實現:

package set;

import java.util.ArrayList;
import java.util.List;

public class Gather {

	public static void main(String[] args) {
		List<String> list = new ArrayList<String>(); // 建立集合物件
		list.add("a");
		list.add("b");
		list.add("c");
		int i = (int) (Math.random() * list.size()); // 獲得0~2之間的隨機數
		System.out.println("隨機獲得陣列中的元素:" + list.get(i));
		list.remove(2); // 移除陣列中第三個元素
		for (int j = 0; j < list.size(); j++) { // 迴圈遍歷集合
			System.out.println(list.get(i));

		}

	}

}

執行結果如下所示:

Set集合

Set集合中的物件不按特定的方式排序,只是簡單地把物件加入集合中,但Set集合中不能包含重複物件。Set集合由Set介面的實現類組成。Set介面繼承了Collection介面,所以包含了Collection的所有方法。(Set允許包含空值,但最多隻能有一個空值

Set介面常用的實現類有HashSet類與TreeSet類。

HashSet類實現Set介面,由雜湊表支援。它不保證Set的迭代順序,特別是它不保證該順序恆久不變。此類允許使用null元素。

Treeset類不僅實現了Set介面,還實現了java.util.SortedSet介面,因此,TreeSet類實現的Set集合在遍歷集合時按照自然順序遞增排序,也可以按照指定比較器遞增排序,即可以通過比較器對用TreeSet類實現的Set集合中的物件進行排序。TreeSet類新增的方法如下表所示:

方法 功能描述
first() 返回此Set中當前第一個元素(最低元素)
last() 返回此Set中當前最後一個(最高)元素
comparator() 返回對此Set中的元素進行排序的比較器,如果此Set是自然順序,則返回null
headSet(E toElement) 返回一個新的Set集合,新集合是toElement(不包含)之前的所有物件
subSet(E fromElement,E fromElement) 返回一個新的Set集合,是fromElement(包含)物件與fromElement(不包含)物件之前的所有物件
tailSet(E fromElement) 返回一個新的Set集合,新集合包含物件fromElement(包含)之後的所有物件

下面程式碼實現:

package set;

import java.util.Iterator;
import java.util.TreeSet;

public class UpdateStu implements Comparable<Object> { // 建立類實現Comparable介面
	String name;
	long id;

	public UpdateStu(String name, long id) { // 構造方法
		this.id = id;
		this.name = name;

	}

	@Override
	public int compareTo(Object o) {
		UpdateStu upstu = (UpdateStu) o;
		int result = id > upstu.id ? 1 : (id == upstu.id ? 0 : -1);// 三目運算子就是用自己的id和傳入物件的id最比較如果自己的id大於upstu的id,那麼值為1,否則再判斷是否相等,如果相等則為0,不相等則為1
		return result;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public static void main(String[] args) {
		UpdateStu stu1 = new UpdateStu("張三", 001);
		UpdateStu stu2 = new UpdateStu("李四", 002);
		UpdateStu stu3 = new UpdateStu("王五", 003);
		UpdateStu stu4 = new UpdateStu("馬六", 004);
		TreeSet<UpdateStu> tree = new TreeSet<UpdateStu>(); // 建立集合把UpdateStu放在集合中
		tree.add(stu1);
		tree.add(stu2);
		tree.add(stu3);
		tree.add(stu4);
		Iterator<UpdateStu> it = tree.iterator(); // Set集合中的所有物件的程式碼
		System.out.println("Set集合中的所有元素:"); // 建立迭代器遍歷集合
		while (it.hasNext()) {
			UpdateStu stu = (UpdateStu) it.next();
			System.out.println(stu.getId() + "" + stu.getName());
		}
		it = tree.headSet(stu2).iterator(); // 擷取排在stu2物件之前的物件
		System.out.println("擷取前面部分的集合:");
		while (it.hasNext()) {
			UpdateStu stu = (UpdateStu) it.next();
			System.out.println(stu.getId() + "" + stu.getName());

		}
		it = tree.subSet(stu2, stu3).iterator();// 擷取排在stu2和stu3之間的物件
		System.out.println("擷取中間部分的集合");
		while (it.hasNext()) { // 遍歷集合
			UpdateStu stu = (UpdateStu) it.next();
			System.out.println(stu.getId() + "" + stu.getName());
		}

	}
}

執行結果如下所示:

存入TreeSet類實現的Set集合必須實現Comparable介面,該介面中的CompareTo(Object o)方法比較此物件與指定物件的順序。如果該物件小於、等於或大於指定物件,則分別返回負整數、0、正整數。

Map集合

Map集合沒有繼承Collection介面,其提供的是Key到Value的對映。Map中不能包含相同的Key,每個key只能對映一個value。key還決定了儲存物件在對映中的儲存位置,但便是由key物件本身決定的,而是採用直接定址技術。

Map介面

Map介面提供了將Key對映到值的物件。一個對映不能包含重複的Key,每個Key最多隻能對映一個值。Map介面中同樣提供了集合的常用方法,除此之外還包括如下表所示的方法:

方法 功能描述
put(K key,V value) 向集合中新增指定的key與value的對映關係
containsKey(Object key) 如果此對映包含指定key的對映關係,則返回true
containsValue(Object value) 如果此對映將一個或多個Key對映到指定值,則返回true
get(Object key) 如果存在指定的key物件,則返回該物件對應的值,否則返回null。
keySet() 返回該集合中的所有key物件形成的Set集合
values() 返回該集合中所有值形成的Collection集合

程式碼如下所示:

package set;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class UpdateStuTest {
	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>(); // 建立Map物件
		map.put("01", "李同學");
		map.put("02", "張同學");
		Set<String> set = map.keySet(); // 構建Map集合中所有key物件的集合
		Iterator<String> it = set.iterator(); // 建立集合迭代器
		System.out.println("key集合中的元素:");
		while (it.hasNext()) {
			System.out.println(it.next());
		}
		Collection<String> collection=map.values();  //構建Map集合中所有values值的集合
		it=collection.iterator();
		System.out.println("values集合中的元素:");
		while(it.hasNext()){
			System.out.println(it.next());
		}

	}

}

執行結果如下所示:

Map集合中允許值物件是null,而且沒有個數限制。例如,可通過"map.put("05",null);"語句向集合中新增物件。

Map集合的實現類

Map介面常用的實現類有HashMap和TreeMap。建議使用HashMap類實現Map集合,因為由HashMap類實現的Map集合新增和刪除對映關係效率更高。HashMap是基於雜湊表的Map介面的實現,HashMap通過雜湊碼對其內部的對映關係進行快速查詢;而TreeMap中的對映關係存在一定的順序,如果希望Map集合中的物件也存在一定的順序,應該使用TreeMap類實現Map集合。

HashMap類是基於雜湊表的Map介面的實現,此實現提供所有可選的對映操作,並允許使用null值和null鍵,但必須保證鍵的唯一性。HashMap通過雜湊表對其內部的對映關係進行快速查詢。此類不保證對映的順序,特別是它不保證該順序恆久不變。

TreeMap類不僅實現了Map介面,還實現了java.util.SortedMap介面,因此,集合中的對映關係具有一定的順序。但在新增、刪除和定位對映關係時,TreeMap類比HashMap類效能稍差。由於TreeMap類實現的Map集合中的對映關係是根據鍵物件按照一定的順序排列的,因此不允許鍵物件是null。

程式碼如下所示:

package set;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

public class Emp {
	private String e_id;
	private String e_name;

	public Emp(String e_id, String e_name) {
		this.e_id = e_id;
		this.e_name = e_name;
	}

	public String getE_id() {
		return e_id;
	}

	public void setE_id(String eId) {
		e_id = eId;
	}

	public String getE_name() {
		return e_name;
	}

	public void setE_name(String eName) {
		e_name = eName;
	}

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>(); // 由HashMap實現的Map物件
		Emp emp = new Emp("351", "張三"); // 建立Emp物件
		Emp emp2 = new Emp("512", "李四");
		Emp emp3 = new Emp("853", "王一");
		Emp emp4 = new Emp("125", "趙六");
		Emp emp5 = new Emp("341", "黃七");
		map.put(emp4.getE_id(), emp4.getE_name()); // 將emp物件放在map集合中
		map.put(emp5.getE_id(), emp5.getE_name());
		map.put(emp.getE_id(), emp.getE_name());
		map.put(emp2.getE_id(), emp2.getE_name());
		map.put(emp3.getE_id(), emp3.getE_name());
		Set<String> set = map.keySet(); // 獲取Map集合中的Key物件集合放入set集合中
		Iterator<String> it = set.iterator();
		System.out.println("HashMap類實現的Map集合,無序:");
		while (it.hasNext()) {
			String str = (String) it.next(); // 遍歷Map集合
			String name = (String) map.get(str);
			System.out.println(str + "" + name);
		}
		TreeMap<String, String> treemap = new TreeMap<String, String>(); // 建立TreeMap集合物件
		treemap.putAll(map); // 向集合中新增物件
		Iterator<String> iter = treemap.keySet().iterator();
		System.out.println("TreeMap類實現的Map集合,鍵物件升序:");
		while (iter.hasNext()) { // 遍歷TreeMap集合物件
			String str = (String) iter.next(); // 獲取集合中的所有key物件
			String name = (String) treemap.get(str); // 獲取集合中的所有values值
			System.out.println(str + " " + name);

		}

	}

}

執行結果如下所示: