Java集合大綱

Java 集合位於java.util包下。嚴格的來說是位於rt.jar下的java.util包。 這個集合用到了很多常用的數據結構比如數組、鏈表、棧、隊列、樹、堆、集合、哈希表。這裏數據結構大概可以分爲四類1.集合(元素之間除了“同屬一個集合” 的相互關係外,別無其他關係) 2.線性結構(元素之間存在一對一的相互關係) 3.樹形結構(元素之間存在一對多的相互關係) 4.圖形結構(元素之間存在多對多的相互關係)

我們主要從五方面來分析java集合 1.List列表、2.Set集合、3.Map映射、4.迭代器(Iterator、Enumeration)、5.工具類(Arrays、Collections)

回顧數據結構
線性結構
  1. 數組 是在內存中開闢一段連續的空間,並在此空間存放元素。(元素類型是固定的、長度是固定的、通過角標查詢,查詢快,增刪慢)
  2. 鏈表 是物理存儲單元上非連續 邏輯上通過指針來實現鏈接次序就是連續(不需要確定長度大小,也不需要連續的內存空間,由於不連續內存空間導致 查找慢 增刪還可以 而且每個元素都要存儲其他元素的指針增大了內存的開銷)鏈表分爲 單向 雙向 有序(以hash值爲標準的排序) 循環(一個圈 各自拿着對應的指針)
  3. 棧 是限定僅在表尾進行插入和刪除操作的線性表。棧又稱爲後進先出(Last in first out)的線性表,簡稱LIFO結構。 棧存儲結構分爲兩種順序存儲結構鏈式存儲結構 (底層就是 數組和鏈表)優缺點也是數組跟鏈表的優缺點。
  4. 隊列 是隻允許在一端進行插入操作,而在另一端進行刪除操作的線性表。隊列是一種先進先出(first in first out)的線性表,簡稱FIFO。隊列存儲結構分爲兩種 順序存儲結構 、鏈式存儲結構 (底層就是 數組和鏈表)
    隊列爲了避免數組插入和刪除時需要移動數據,於是就引入了循環隊列,使得隊頭和隊尾可以在數組中循環變化。解決了移動數據的時間損耗。實質底層用的是循環鏈表
樹形結構
  1. 樹 是包含n個結點的有窮集 根節點下帶有n個子節點 然後這些子節點又作爲根節點帶着n個子節點。
    • 如果G是樹,那麼邊數=頂點數-1
    • 樹中任意兩點存在唯一路徑
    • 樹是連通的而且任何邊均爲橋
    • 在樹中不同兩點加上一個邊會得到唯一一個圈
  2. 二叉樹 是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”和“右子樹”。
    • 一棵深度爲k,且有2^k-1個節點稱之爲滿二叉樹,一棵二叉樹第i層最多有2^(i-1)個節點;
    • 深度爲k,有n個節點的二叉樹,當且僅當其每一個節點都與深度爲k的滿二叉樹中,序號爲1至n的節點對應時,稱之爲完全二叉樹
  3. 堆 也被稱爲優先隊列(priority queue)。隊列中允許的操作是先進先出(FIFO),在隊尾插入元素,在隊頭取出元素。而堆也是一樣,在堆底插入元素,在堆頂取出元素,但是堆中元素的排列不是按照到來的先後順序,而是按照一定的優先順序排列的。這個優先順序可以是元素的大小或者其他規則。
    • 堆優先順序就是大的元素排在前面,小的元素排在後面,這樣得到的堆稱爲最大堆
    • 堆優先順序就是小的元素排在前面,大的元素排在後面,這樣得到的堆稱爲最小堆
    • 最大堆:每個節點的值都大於等於它的孩子節點。
    • 最小堆:每個節點的值都小於等於它的孩子節點。
    • 可以理解爲二叉樹的一種,是節點間有序關係的完全二叉樹,所以可以用數組來表示。
    • 對於下標爲i的節點,它的子樹的左節點的下標爲2i,右節點爲2i+1,父親的節點下標爲i/2(向下取整)。注意是下標這是按完全二叉樹的下標
      這裏寫圖片描述
哈希表結構
  1. 哈希表支持一種最有效的檢索方法:散列。哈希表包含一個數組,通過特殊的索引值(鍵)來訪問數組中的元素。2.
  2. 哈希表的主要思想是通過一個哈希函數,在所有可能的鍵與槽位之間建立一張映射表。哈希函數每次接受一個鍵將返 回與鍵相對應的哈希編碼或哈希值。鍵的數據類型可能多種多樣,但哈希值的類型只能是整型。
  3. 鏈式哈希表從根本上說是由一組鏈表構成。每個鏈表都可以看做是一個“桶”,我們將所有的元素通過散列的方式放到具體的不同的桶中。
  4. 當哈希函數能夠保證不同的鍵生成的哈希值互不相同時,就說哈希表能直接尋址想要的結果。但這只是理想狀態,在實際運用過程中,能夠直接尋址結果的情況非常少。解決方法 具體參考這個篇博客 http://www.cnblogs.com/idreamo/p/8031120.html
java集合分析

這裏寫圖片描述

  1. Collection 依賴(作爲它的成員屬性存在) Iterator 因爲其繼承了 Iterable這裏寫圖片描述是List、Set等集合高度抽象出來的接口,它包含了這些集合的基本操作,它主要又分爲兩大部分:List和Set。
  2. List (存儲一組不唯一且按插入順序排序的對象,可以操作索引)常用實現類爲ArrayList和LinkedList,另外還有不常用的Vector。另外,LinkedList還是實現了Queue接口,因此也可以作爲隊列使用。 注意 他的存儲結構 分爲順序存儲 和鏈式存儲 底層就是數組和鏈表 其實棧的底層也是數組和鏈表 隊列也是的。Vector是線程安全的,ArrayList、LinkedList都是線程不安全的*Vector是jdk1.0的產物被ArrayList替代了。長度需要增長時,Vector默認增長1倍,ArrayList增長1.5倍*
  3. Set (存儲一組唯一且無序的對象)通過hashcode和equals函數保證唯一性,常用實現類有HashSet和TreeSet,HashSet是通過Map中的HashMap實現的 它是無序的,而TreeSet是通過Map中的TreeMap實現的。另外,TreeSet還實現了SortedSet接口,因此是有序的集合(集合中的元素要實現Comparable接口,並覆寫Compartor函數才行)。它的存儲結構底層是 哈希表和二叉樹 HashSet是 哈希表所以無序 TreeSet是二叉樹是唯一的 並用比較接口來確定的排序方式。 LinkedHashSet是哈希表加鏈表 哈希表來確定的唯一性 鏈表來確定的有序。他們都是線程不安全的
  4. Map(以鍵值對的形式存儲元素,鍵是唯一的,也就是key)TreeMap、HashMap、WeakHashMap等實現類都通過繼承AbstractMap來實現,另外,不常用的HashTable直接實現了Map接口,它和Vector都是JDK1.0就引入的集合類。HashTable是將鍵映射到hash表中相應的值 HashMap底層也是hash表 使用了HashTable。LinkedHashMap由哈希表實現元素的存儲,由鏈表實現元素的順序。 TreeMap由二叉樹實現 確定了唯一 實現 Comparable接口,重寫compareTo方法,提供對象排序的方式。底層還是hash表 二叉樹 鏈表,只要底層是hash表的 必須重寫hashcode 和equals方法(相當於hash函數的算法就是確定唯一性) 是二叉樹的就要重寫conmprator 排序的方法 還要注意Hashtable是早期的JDK提供的接口,HashMap是新版的JDK提供的接口,Hashtable是線程安全,HashMap線程非安全Hashtable不允許null鍵和值,HashMap允許null值
  5. Iterator是遍歷集合的迭代器(不能遍歷Map,只用來遍歷Collection),Collection的實現類都實現了iterator()函數,它返回一個Iterator對象,用來遍歷集合,ListIterator則專門用來遍歷List。而Enumeration則是JDK1.0時引入的,作用與Iterator相同,但它的功能比Iterator要少,它只能再Hashtable、Vector和Stack中使用。ListIterator,解決併發修改集合的問題 不允許在操作集合的時候再去修改集合元素
  6. Arrays和Collections是用來操作數組、集合的兩個工具類,例如在ArrayList和Vector中大量調用了Arrays.Copyof()方法,而Collections中有很多靜態方法可以返回各集合類的synchronized版本,即線程安全的版本,當然了,如果要用線程安全的結合類,首選Concurrent併發包下的對應的集合類。CopyOnWriteArrayList ConcurrentHashMap

下面有兩張圖 摘自網上:

這裏寫圖片描述

這裏寫圖片描述

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