Java-Collection和Map容器

Collection集合接口

Collection是最基本的集合接口,一個Collection代表一組Object,即Collection的元素(Elements)。一些Collection允許相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接繼承自Collection的類,Java SDK提供的類都是繼承自Collection的“子接口”如List和Set。

主要方法:

boolean add(Object o) —— 添加對象到集合
boolean remove(Object o) —— 刪除指定的對象
boolean contains(Object o) —— 查找集合中是否有指定的對象
boolean isEmpty() —— 判斷集合是否爲空
boolean containsAll(Collection c) —— 查找集合中是否有集合c中的元素
boolean addAll(Collection c) —— 將集合c中所有的元素添加給該集合

int size() —— 返回當前集合中元素的數量

Iterator iterator() —— 返回一個迭代器

void clear() —— 刪除集合中所有元素
void removeAll(Collection c) —— 從集合中刪除c集合中也有的元素
void retainAll(Collection c) —— 從集合中刪除集合c中不包含的元素

List接口

List是有序的Collection,使用此接口能夠精確的控制每個元素插入的位置(按照元素插入順序存儲)。用戶能夠使用get()方法和索引來訪問List中的元素。

LinkedList類

LinkedList實現了Deque接口(Deque繼承了Queue接口),繼承AbstractSequentialList類,允許null元素,底層用雙向鏈表實現,在添加刪除方面比較便捷,按照添加順序存儲,沒有初始大小。LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。

注意:LinkedList是非同步方法。

ArrayList類

ArrayList實現List接口,繼承了AbstractList類,底層用可變大小的數組實現,允許所有元素,包括null,在隨機訪問元素方面比較便捷,按照添加元素順序存儲,初始大小爲10,每次擴容當前大小的1/2。ArrayList可用作動態數組。

注意:ArrayList也是非同步的(unsynchronized),Vector非常類似ArrayList,但是Vector是同步的,而且 初始化大小爲 10 ,擴容原來的一倍。對於需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。

public class ArrayListTest {

	public static void main(String[] args) {
		ArrayList arrayList = new ArrayList();
		arrayList.add(100);
		arrayList.add(12.14);
		arrayList.add(true);
		arrayList.add("arrayList");
		arrayList.add('A');
		System.out.println(arrayList.get(0));
		
		// 獲取ArrayList大小用 size();
		for (int i = 0; i < arrayList.size(); i++) {
			System.out.println(arrayList.get(i));
		}
		
		// contains是否包含某個對象
		System.out.println("是否包含\"arrayList\"字符串" + arrayList.contains("arrayList"));
		
		arrayList.add(101);
		// 輸出第一次出現下標 0 開始
		System.out.println("101第一次出現位置:" + arrayList.indexOf(101));
		
		// 元素個數
		System.out.println("集合中元素個數:" + arrayList.size());
		
		// 判斷集合是否沒有元素
		System.out.println("arrayList是否有元素:" + arrayList.isEmpty());
		
		Iterator iterator = arrayList.iterator();
		// 如果迭代器iterator不爲空,輸出iterator.next()
		while (iterator.hasNext()) {
			System.out.print(iterator.next() + " ");
		}
		
		// contains算法包含某個對象
		System.out.println(arrayList.contains("arrayList"));
		
		// 刪除元素,被刪除後面元素往前移動
		arrayList.remove(1);
		Iterator it = arrayList.iterator();

		while (it.hasNext()) {
			System.out.print(it.next() + " ");
		}
		
		Object[] objects = arrayList.toArray();
		for (Object object : objects) {
			System.out.print(object + " ");
		}
		System.out.println("數組中大小:" + objects.length);
		
		// 清空ArrayLIst
		arrayList.clear();
		System.out.println("集合中元素個數:" + arrayList.size());
		
	}
}
public class LinkedListDemo {
	
	public static void main(String[] args) {
		News news1 = new News("1001","1001","1001",new Date());
		News news2 = new News("1002","1002","1002",new Date());
		News news3 = new News("1003","1003","1003",new Date());
		News news4 = new News("1004","1004","1004",new Date());
		News news5 = new News("1005","1005","1005",new Date());
	
		LinkedList<News> linkedList = new LinkedList<News>();
	
		linkedList.add(news1);
		linkedList.add(news2);
		linkedList.add(news3);
		linkedList.add(news4);
		linkedList.add(news5);
		
		Iterator<News> iterator = linkedList.iterator();
		
		while (iterator.hasNext()) {
			News news = iterator.next();
			System.out.println(news);
			/*System.out.println(news.getId() + " " + news.getName() + " " 
					+ news.getCreater() + " " + news.getCreateTime());*/
		}
		
		System.out.println("\n-------------------\n");
		
		// 在開始添加
		linkedList.addFirst(news5);
		
		// 在最後添加
		linkedList.addLast(news1);
		
		// 刪除1002
		linkedList.remove(2);
		
		// 刪除第一個
		linkedList.removeFirst();
		
		// 刪除最後一個
		linkedList.removeLast();
		
		for (int i = 0; i < linkedList.size(); i++) {
			System.out.println(linkedList.get(i));
		}
	}
}

Set接口

Set是一種不包含重複的元素的Collection(Set最多有一個null元素),無序存儲(HashSet不按照元素插入順序存儲,LinkedHashSet按照元素插入順序存儲,TreeSet按照設定的比較順序進行排序存儲)

HashSet類

不允許出現重複元素,不保證集合中元素的順序,允許包含值爲null的元素,但最多隻能有一個null元素,查詢速度比較快。

注意:ListHashSet可以按照存入元素順序存儲

TreeSet

不允許出現重複元素,底層用紅-黑樹結構存儲,按照存入對象的判定順序順序存儲(自定義對象要實現Comparable接口,重寫compareTo方法)

TreeSet對元素的排序有兩種方式:

方式一:使元素(對象)對應的類實現Comparable接口,覆蓋compareTo方法。這樣元素自身具有比較功能。

方式二:使TreeSet集合自身具有比較功能,定義一個類實現Comparable接口覆蓋其compareTo方法。(相當於自定義了一個比較器)將該類對象作爲參數傳遞給TreeSet集合的構造函數。(TreeSet(Comparator<?
super E> c) )

public class SetDemo {

	/**
	 * · HashSet存儲元素是無序的
	 */
	
	/**
	 * · treeSet存儲對象如果想要排序,必須重寫Comparable方法
	 */
	
	public static void main(String[] args) {
		
		Set<String> set = new HashSet<String>();
		
		set.add("java");
		set.add("c++");
		set.add("golang");
		set.add("python");
		set.add("c");
		set.add("c"); // 沒有重複對象
		
		System.out.println(set);
		
		// 遍歷HsahSet
		for (String string : set) {
			System.out.println(string);
		}
		
		Set<Integer>  treeSet = new TreeSet<Integer>();
		
		treeSet.add(50);
		treeSet.add(80);
		treeSet.add(90);
		treeSet.add(90); // 沒有重複對象
		treeSet.add(20);
		treeSet.add(100);
		
		System.out.println(treeSet);
		// 利用迭代器遍歷TreeSet
		Iterator<Integer> iterator = treeSet.iterator();
		while (iterator.hasNext()) {
			System.out.println(iterator.next());
		}
		
		Student s1 = new Student("1001", "cr7", 88);
		Student s2 = new Student("1002", "lm10", 78);
		Student s3 = new Student("1003", "c9", 68);
		Student s4 = new Student("1004", "pd19", 98);
		
		Set<Student>  tree = new TreeSet<Student>();
		
		tree.add(s1);
		tree.add(s2);
		tree.add(s3);
		tree.add(s4);
		
		// student對象 需要Comparable接口覆蓋其compareTo方法
		Iterator<Student> it = tree.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}
}

Map集合接口

Map沒有繼承Collection接口,Map提供key到value的映射。一個Map中不能包含相同的key,每個key只能映射一個 value。Map接口提供3種集合的視圖,Map的內容可以被當作一組key集合,一組value集合,或者一組key-value映射。

主要方法:

void clear( ) —— 從此映射中移除所有映射關係(可選操作)
void putAll(Map m) —— 從指定映射中將所有映射關係複製到此映射中(可選操作)

boolean containsKey(Object k) —— 如果此映射包含指定鍵的映射關係,則返回 true
boolean containsValue(Object v) —— 如果此映射將一個或多個鍵映射到指定值,則返回 true
boolean isEmpty( ) —— 如果此映射未包含鍵-值映射關係,則返回 true
boolean equals(Object obj) —— 比較指定的對象與此映射是否相等

Set entrySet( ) —— 返回此映射中包含的映射關係的 Set 視圖

Object get(Object k) —— 返回指定鍵所映射的值;如果此映射不包含該鍵的映射關係,則返回 null
Object put(Object k, Object v) —— 將指定的值與此映射中的指定鍵關聯(可選操作)
Object remove(Object k) —— 如果存在一個鍵的映射關係,則將其從此映射中移除(可選操作)

int hashCode( ) —— 返回此映射的哈希碼值
int size( ) —— 返回此映射中的鍵-值映射關係數

Set keySet( ) —— 返回此映射中包含的鍵的 Set 視圖

Collection values( ) —— 返回此映射中包含的值的 Collection 視圖

HashMap類

HashMap是非同步的,並且允許null,即null value和null key,但是隻能有一個null Key,因爲Key是不能重複的,查詢的效率比較高,默認初始容量 (16) 和默認加載因子 (0.75) ,底層是數組+鏈表實現的,JKD1.8底層是數組+鏈表+紅黑樹

注意:LinkedHashMap可以按照存入元素順序存儲。

TreeMap類

TreeMap繼承Map接口,排序根據紅黑樹(Red-Black tree)實現。該映射根據其鍵的自然順序進行排序,或者根據創建映射時提供的 Comparator 進行排序,具體取決於使用的構造方法。

HashMap和Hashtable的區別?

HashMap繼承於AbstractMap類,Hashtable繼承於Dictionary類
HashMap可以有 null key 和null value,Hashtable不允許有null key 和 null value
HashMap是非線性安全的,Hashtable是線性安全的
HashMap默認的初始化大小爲16,之後每次擴充,容量變爲原來的2倍;Hashtable默認的初始大小爲11,之後每次擴充,容量變爲原來的2n+1。

注:迭代子操作時間開銷和HashMap的容量成比例。因此,如果迭代操作的性能相當重要的話,不要將HashMap的初始化容量設得過高,或者loadfactor過低。

public class MapDemo {
	public static void main(String[] args) {
		
		Student s1 = new Student("1001", "cr7", 88);
		Student s2 = new Student("1002", "lm10", 78);
		Student s3 = new Student("1003", "c9", 68);
		Student s4 = new Student("1004", "pd19", 98);
		
		// 創建HashMap對象,
		Map<String, Student> map = new HashMap<String, Student>();
		
		map.put("s1", s1);
		map.put("s2", s2);
		map.put("s3", s3);
		map.put("s4", s4);
		
		// 獲取map中所有的鍵,存放在一個Set中
		System.out.println(map.keySet());
		
		// 獲取map中所有的值,存放在一個集合中
		System.out.println(map.values());
		
		// 鍵值對
		System.out.println(map);
		
		// foreach遍歷
		for (String string : map.keySet()) {
			System.out.println(string + " : " + map.get(string));
		}
		
		System.out.println("\n_____刪除______\n");
		
		// 刪除
		map.remove("s4");
		
		// 迭代器遍歷
		Iterator iterator = map.keySet().iterator();
		while (iterator.hasNext()) {
			String string = (String) iterator.next();
			System.out.println(string + " : " + map.get(string));
		}
		
		
		// 是否包含某個鍵
		System.out.println(map.containsKey("s1"));
		System.out.println(map.containsKey("s4"));
		
		// 是否包含某個值
		System.out.println(map.containsValue(s1));
		System.out.println(map.containsValue(s4));
		
		// 元素個數
		System.out.println(map.size());
		
		// 獲取Map實體遍歷
		Set<Entry<String, Student>> setEntity = map.entrySet();
		Iterator<Entry<String, Student>>  iterator2 = setEntity.iterator();
		while (iterator2.hasNext()) {
			Entry<String, Student> entry = iterator2.next();
			System.out.println(entry.getKey() + " : " + entry.getValue());
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章