天天看點

javase複習——集合

目錄

    • 集合概述
    • Java 集合架構主要結構圖
    • Collection接口介紹
      • 所有的方法
      • List接口
        • ArrayList
        • LinkedList
        • Vector
      • Set
        • HashSet
        • LinkedHashSet
        • TreeSet
    • Map接口介紹
      • HashMap
      • TreeMap
      • HashTable
        • LinkedHashMap
    • 集合周遊時修改元素出現并發問題解決方法
    • 隊列及高并發相關介紹

集合概述

1、集合類存放于java.util包中。

2、集合類型主要有3種:set(集)、list(清單)和map(映射)。

3、集合存放的都是對象的引用,而非對象本身。是以我們稱集合中的對象就是集合中對象的引用。

簡單來講:集合就是一個放資料的容器,準确的說是放資料對象引用的容器

Java 集合架構主要結構圖

javase複習——集合

1、集合主要分為Collection和Map兩個接口

2、Collection又分别被List和Set繼承

3、List被AbstractList實作,然後分為3個子類,ArrayList,LinkList和Vector

4、Set被AbstractSet實作,又分為2個子類,HashSet和TreeSet

5、Map被AbstractMap實作,又分為2個子類,HashMap和TreeMap

6、Map被Hashtable實作

javase複習——集合

Collection接口介紹

所有的方法

javase複習——集合

List接口

ArrayList

List 接口的大小可變數組的實作。實作了所有可選清單操作,并允許包括 null 在内的所有元素。除了實作 List 接口外,此類還提供一些方法來操作内部用來存儲清單的數組的大小。

基本特點:

  • ArrayList中的元素和可以重複
  • 是有序的集合
  • 長度不固定
  • 不是線程安全的,效率高

詳細介紹

LinkedList

List 接口的連結清單實作。實作所有可選的清單操作,并且允許所有元素(包括 null)。

除了實作 List 接口外,LinkedList 類還為在清單的開頭及結尾 get、remove 和 insert 元素提供了統一的命名方法。

這些操作允許将連結清單用作堆棧、隊列或雙端隊列。

不是線程安全的。

特有的一些方法:

javase複習——集合

詳細介紹

Vector

和ArrayList功能類似,最主要的差別就在于vector是線程并發安全的。

但是缺點是效率比較低。

詳細介紹

Set

一個不包含重複元素的 collection。更确切地講,set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2,并且最多包含一個 null 元素。

HashSet

此類實作 Set 接口,由哈希表(實際上是一個 HashMap 執行個體)支援。它不保證 set 的疊代順序;特别是它不保證該順序恒久不變。此類允許使用 null 元素。

HashSet的唯一性:

在HashSet做添加的時候會逐個來判斷目前集合中的對象和要添加的對象的比較

通過以下的條件判斷兩個對象是否相等

  • e.hash == hash && ((k = e.key) == key || key.equals(k))
  • hash值必須相等并且兩個對象的位址值相等或者equals傳回true

注意:當此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的正常協定,該協定聲明相等對象必須具有相等的哈希碼。

特點:

  • 元素唯一性
  • 無序性
  • 允許null存在一個
  • 不是線程安全(效率高)

之是以允許null存在一個是因為在源碼中null被當作0看待

詳細介紹

LinkedHashSet

具有可預知疊代順序的 Set 接口的哈希表和連結清單實作。此實作與 HashSet 的不同之外在于,後者維護着一個運作于所有條目的雙重連結清單。此連結清單定義了疊代順序,即按照将元素插入到 set 中的順序(插入順序)進行疊代。

特點:

  • 元素唯一性
  • 有序的
  • 允許null存在一個
  • 不是線程安全(效率高)

詳細介紹

TreeSet

TreeSet可以支援自定義排序,如果TreeSet所存儲的對象的類沒有實作Comparable接口就會報錯ClassCastException。

是以我們如果想要使用TreeSet來對自定義的對象來排序必須實作Comparable接口。

特點:

  • 元素唯一性
  • 可自定義排序的
  • 不允許null存在
  • 不是線程安全

詳細介紹

Map接口介紹

Map即使鍵值對的集合的接口抽象。

javase複習——集合

我們可以通過key的值來獲得相應的值,将鍵映射到值的對象。一個映射不能包含重複的鍵;每個鍵最多隻能映射到一個值。鍵隻允許有一個空值,值可以有多個空值。

javase複習——集合

Map的特點:

  • 資料成對出現
  • 資料的鍵是唯一的
  • 一個鍵隻能對應一個值
  • 值可以重複
  • 鍵允許有一個為空,值可以多個是空

所有方法:

javase複習——集合

HashMap

HashMap的特點:

  • HashMap是map的實作類
  • 允許多個null值和一個null鍵
  • HashMap中的元素沒有順序(跟添加的順序無關)
  • HashMap不是線程安全的

詳細介紹

TreeMap

TreeMap可以參考TreeSet,TreeMap可以支援Map的排序

該映射根據其鍵的自然順序進行排序,或者根據建立映射時提供的 Comparator 進行排序,具體取決于使用的構造方法

TreeMap特點:

  • 可以按着key來做排序
  • Key不能null,key不能重複,值可以有多個null
  • 不是線程安全的

詳細介紹

HashTable

HashTable的特點:

  • HashTable是map的實作類
  • 不允許任何null值和null鍵
  • HashTable中的元素沒有順序(跟添加的順序無關)
  • HashTable是線程安全的。

詳細介紹

LinkedHashMap

LinkedHashMap的特點:

  • LinkedHashMap是map的實作類
  • 允許多個null值和一個null鍵
  • LinkedHashMap有順序(添加的順序)
  • LinkedHashMap不是線程安全的

詳細介紹

集合周遊時修改元素出現并發問題解決方法

public static void main(String[] args) {
    // 建立List集合對象
    List list = new ArrayList();
    // 添加元素
    list.add("中國");
    list.add("美國");
    list.add("日本");


	// 疊代器周遊 出現異常
	// Iterator it = list.iterator();
	// while (it.hasNext()) {
	// String s = (String) it.next();
	// if ("中國".equals(s)) {
	// list.add("南韓");
	// }
	// }
	// 方案1:疊代器疊代元素,疊代器修改元素
	// 而Iterator疊代器卻沒有添加功能,是以我們使用其子接口ListIterator
	// ListIterator lit = list.listIterator();
	// while (lit.hasNext()) {
	// String s = (String) lit.next();
	// if ("中國".equals(s)) {
	// lit.add("南韓");
	// }
	// }
	// 方案2:集合周遊元素,集合修改元素(普通for)
    for (int x = 0; x < list.size(); x++) {
          String s = (String) list.get(x);
          if ("中國".equals(s)) {
              list.add("南韓");
          }
      }
      System.out.println("list:" + list);
      }
           

在疊代器和增強for循環裡直接修改集合是會出現并發異常

隊列及高并發相關介紹

詳細介紹