JAVA基本容器總結(學習筆記)

JAVA基本容器總結

1. 容器繼承

在java的容器裏面存在兩大分支分別是Collection和Map,但無論是哪一種它們共同的基本作用是儲存數據

Collection圖

Collection

Map圖

Map

此圖只涉及基本的容器類型,有部分的容器並沒有列出


Collection家族

  • 迭代器Iterable

    雖然迭代器本身作爲Collection的頂級接口,但是Iterable並沒有任何有關容器的規範約定。但是這個接口提供了一個非常強大的迭代功能,可以解決Collection體系下所有的集合內部數據的遍歷。

常見方法圖表

方法名 方法返回值類型 方法描述
hasNext() boolean hasNext()是判斷目標容器是否有下一位數據,如果存在返回true反之false
next() E next()可以理解爲獲取容器的下一位數據,其返回值類型是在Colletion的實現類實例化時確定
    ArrayList<String> arr = new ArrayList<Stirng>();
    Iterator<String> it = arr.iterator();
    while(it .hasNext){
        String str = it .next();   
    }

一般這樣的方式就可以實現以Collect家族容器的遍歷獲取。但是這種獲取無法對集合中的基本數據類型進行修改操作,想要修改數據需要對應的包裝類

  • 頂層接口Collection

    Collection是集合中的頂層接口,它確定了所有集合的規範。
    所有它的實現類都可以使用它所定義的方法。在Collection的衆多的實現類裏面,存在着有序和無序的集合,可重複和不可重複的。
    但是這些都是尤其子接口實現,Collection只提供普遍性的操作。

    Collection本身的對象是有序可重複的

常見方法圖表

方法名 方法返回值類型 方法描述
add(E e) boolean 向集合中添加e元素
clear() void 把集合內部的所有的元素全部元素
contains(Object o) boolean 判斷o的對象是否在集合當中
remove(Object o) boolean 移除集合中的o對象
size() int 返回集合的大小
toArray() Object 將此集合轉化一個數組
  • remove() 在移除指定的而對象的時候,如果容器存在多個此對象,只會移除第一個遇到的元素

通過Collection我們可以知道,Collection接口主要提供了一個容器的基本功能,添加、移除、清空、轉換數組、返回大小、判斷存在… 配合Iterabl提供的迭代遍歷實現了容器的數據獲取和修改。

接口List(序列)

List是Collection的有序分支,並且提供可重複元素的添加。除此之外其重寫了Collection接口提供的方法,併爲部分方法進行了重載,以此來展現其特性。

主要特點

  • 有序
  • 索引
  • 可重複

常見方法圖

方法名 方法返回值類型 方法描述
add(E e) boolean 向列表尾部添加e元素
add(int index,E e) void 在index位置添加e元素,原index位置元素向後移
get(int index) E 獲取到index位置的元素
remove(int index) E 移除index位置的元素
remove(Object o) boolean 移除o元素
set(int index,E e) E 在index位置的元素替換爲e

在list的常見的方法中,存在幾個重載的方法,而這幾個新的方法都存在一個特性就是參數列表存在一個索引值。而這個索引值便是List家族的重要的標誌(有序,有索引),也是因爲這個索引List系列的容器可以支持指定位置的數據改變和for循環索引遍歷。

List不支持在使用迭代器遍歷時對容器的長度進行修改,進行修改該會報出併發修改異常

  • 實現類ArrayList(數組結構的List)

ArrayList集合其內部的存儲結構是數組結構。由於數組結構對於數據的遍歷和查詢快,但是對容器內部數據的增刪就慢。

因爲ArrayList的實際本質是一個Object[]的數組,所以當向ArrayList添加的數據超過了Object[]的大小,就會進行數組的複製進行伸長,但是程序複製數據組的過程是非常消耗資源的,所以Arraylist的增刪慢

  • 實現類LinkedList(鏈表結構的List)

LinkedList集合數據存儲的結構是鏈表結構,類似於自行車的鏈條。這種結構有利於數據的增加和刪除,但是查找很不友好。無論是哪一個查詢方式,LinkedList往往是從頭遍歷。這就使linkedList查詢速度慢。

但是正是因爲Linkedlist可以對沒有節點元素進行操作,在Linkedlist裏面添加了大量首尾操作,可以作爲堆棧和隊列等數據使用

常見方法圖

方法名 方法返回值類型 方法描述
addFirst(E e) void 向列表首部部添加e元素
addLast(iE e) void 向列表尾部添加e元素
getFirst() E 返回此列表的第一個元素
getLast() E 返回此列表的最後一個元素
removeLast() E 移除並返回此列表的最後一個元素
removeFirst() E 移除並返回此列表的第一個元素
pop() E 從此列表所表示的堆棧處彈出一個元素
push(E e) void 將元素推入此列表所表示的堆棧
isEmpty boolean 如果列表不包含元素,則返回true

這些都是LinkedList的特有的方法

  • 實現類Vector(數組結構的List)

JDK中最早的可增長的數組結構,已經被更爲先進ArrayList淘汰。不用深究。不同之處在於其爲線程安全,運算速度慢

  • Set接口(Collection另一重要分支)

set使Collection的另一大派系,其主要的於List的區別是set內部不允許存儲相同的對象。
set接口沒有規定太多set派系的公有方法,大部分是將collection提供的方法進行了重寫,用來實現不重複元素的功能。

主要特點

  • 無索引

  • 不重複

    其set所有實現都有該特性

  • 實現類HashSet(哈希表)

HashSet其本質上是由一個HashMap集合提供(可以查看構造器源碼)。
HashSet無法保證迭代的順序和存儲的順序相同。
HashSet保證元素唯一性的方式依賴於: Object提供的 hashCode()和equals()兩個方法

主要特點

  • 無序

HashSet的存儲和取出都比較快。
HashSet是一個數組鏈表的結合體,可以參照下圖

HashCode_1 HashCode_2 HashCode_3 HashCode_4
H1_element1 H2_element1 H3_element1 H4_element1
H1_element2 H2_element2 H3_element2 H4_element2
H1_element3 H2_element3 H3_element3 H4_element3
H1_element4 H2_element4 H3_element4 H4_element4

對於這張表,最上面的一排存儲的是一個特定的HashCode這一排的存儲方式一個數組,而每一列的元素時HashCode相同的元素,這些元素的存儲方式是鏈表
所以對一個元素的添加,會先判斷元素的HashCode是否存在,如果存在再判斷該HashCode列裏面的元素是否存在equals()也相同,如果都相同則無法添加,不同就加載到這一列的最後位置上。
如圖:
HashSet添加流程

  • 繼承類LinkedHashSet(繼承自HashSet)

LinkedHashSet雖然繼承子HashSet但是其是有序的HashSet。
因爲LinkedHashSet運行着一個雙重鏈接列表,其定義了迭代順序

主要特點

  • 有序

其他的使用方式於HashSet完全一致。


Map家族

  • Map接口

Map的存儲方式跟Collection有着很大不同,Map中的集合裏面的數據是成對存在的,這就表明往Map集合裏面添加數據的時候是一次添加兩個數據的。因此Collection中的集合是被稱爲單列集合,而Map中的集合則被稱雙列集合。

主要特點

  • 數據成對出現。一爲“鍵key”,另一個爲“值value”
  • 在同一集合中key不允許重複,而值沒有限制
  • 一個鍵只能對應一個值,而一個值可以對應多個鍵(類似於數學函數)

常見方法圖

方法名 方法返回值類型 方法描述
get(Object key) V 返回key對應的value,如果不存在key則返回null
put(K key,V value) V 可以理解爲添加也可以認爲是修改key對應的value,並返回之前的值,新健返null
remove(Object key) V 移除對應的key和value
  • 實現類HashMap<K,V>

元素無序,並且爲了要保證鍵的唯一,要重寫作爲鍵的對象的HashCode和equals這兩個方法。而它的基本使用和Set接口定義的無區別

  • 實現類LinkedHashMap<K,V>

HashMap的子類,實現了有序

  • 實現類HashTable<K,V>

HashTable的使用特點和HashMap一樣,但是它是一個線程按羣的集合,運算算速度慢。已被淘汰。但是它的一個子類Properties仍然再IO裏面使用

HashMap允許放置null,null但是HashTable不允許null值null鍵


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章