102 java常見的8種數據結構 1,數組 2 鏈表 3棧 4 隊列 5樹

1,數組

優點:
按照索引查詢元素的速度很快;
按照索引便利數組也很快
缺點:
數組的大小在創建後就確定了,無法擴容(只能創建新的數組)
數組只能存儲一種類型的數組(類型定義後就不能修改)
添加,刪除元素的操作很消耗時間,因爲要移動其他元素

2 鏈表

鏈表是一種遞歸的數據結構,他或者爲空(null),或者指向一個節點的引用,
該節點還有一個元素和一個指向另外一條鏈表的引用。
java的LinkedList 類可以很形象的通過代碼的形式來表示一個鏈表的結構


public class LinkedList<E> {
    transient Node<E> first;
    transient Node<E> last;
 
    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;
 
        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }
}

linkedlist在jdk1.6以前是雙向循環鏈表,1.7以後是雙向鏈表
這是一種雙向鏈表,當前元素item既有prev又有next,不過first的prev爲null。last
的next爲null.如果是單向鏈表的話,就只有next,沒有prev.


單向鏈表的缺點是隻能從頭到尾依次遍歷,而雙向鏈表可進可退,既能找到上一個
也可以找到下一個,每個節點上都需要分配有個存儲空間。
鏈表中的數據按照"鏈式"的結構存儲,因此可以達到內存上非連續的效果,數組必須是一塊連續的內存。



由於不必按照順序的方式存儲,鏈表在插入,刪除的時候達到o(1)的時間複雜度(只需要指向引用即可,不需要想數組那樣移動其他元素)。除此之外。鏈表還克服了數組必須預先知道數據大小的缺點從而可以靈活的內存動態管理。
優點:
不需要初始化容量
可以添加任意元素
插入和刪除的時候只需要更新引用
缺點
含有大量的引用,佔用的空間比較大
查找元素需要遍歷整個鏈表,耗時。

3棧

棧就像水桶一樣底部是密封的,頂部是開口,水可以進可以出,用過水桶的小夥伴可以明白,這樣一個道理:先進入的水在底部,後進入的水在頂部;後進入的水被先到出來,先進入的水被後到出來,
同理: 棧按照“後進先出”,“先進後出”的原則來存儲數據,先插入的數據被壓入棧低,後插入的數據在棧頂,讀出的數據的時候,從棧頂開始依次讀出。


4 隊列

隊列就像一段水管一樣,2端都是開口的,水從一端進去,然後從另一端出來,先進去的水先出來,後進入的水後出來
和水管有些不同的是,隊列會對2端進行定義,一端叫做隊頭、另一端叫做隊尾。隊頭只允許刪除操作(出隊),隊尾只允許插入的操作(入隊)。



5樹

樹是一種典型的非線性結構,他是由n (n>0) 個有限節點組成的一個具有層次關係的集合。


之所以叫樹,是因爲這種數據結構看起來就像是一個倒掛的樹,只不過根在上,葉在下。樹形結構有以下特點:
每個節點都只有有限個子節點或無子節點
沒有父節點的節點稱爲根節點
每個非根節點有且只有一個父節點。
除了根節點外,每個子節點分爲多個不相交的子樹。



6 堆:
堆可以被看做是一顆樹的數組對象,具有以下特點:
堆中某個節點的值總是不大於或者不小於其父節點的值
堆總是一顆完全二叉樹
將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。


再線性結構中,數據元素之間滿足唯一的線性關係,每個數據元素(除開第一個和最後一個外均有唯一的前驅和後繼);
在樹形結構中,數據元素之間有着明顯的層次關係,並且誒個數據元素只與上一層中的一個元素(父節點)以及下一層的多個元素(子節點相關);
而在圖形結構中,節點之間的關係是任意的,圖中任意2個數據元素之間都可能相關。
8,哈希表
哈希表(Hash Table),也叫散列表,是一種可以通過關鍵碼值(key-value)直接訪問的數據結構,他的最大特點就是可以快速實現查找,插入和刪除
數組的最大特點是查找容易,插入和刪除困難,而鏈表正好想法,查找困難,插入和刪除容易。哈希表很完美的結合了2者的優點,java的Hashmap在此基礎上還加入了樹的優點



哈希函數在哈希表中起着非常重要的作用,他可以把任意長度此輸入變換成固定的長度輸出,該輸出的是哈希值,哈希函數使得一個數據序列的訪問過程變得更加迅速有效。通過哈希函數,數據元素能夠被很快的進行定位。
若關鍵字爲k,則其值存放在hash(k)的存儲位置上。由此,不需要遍歷就可以直接取得k對應的值。
對於任意2個不相同的數據塊,其哈希值相同的可能性極小,也就是說,對於一個給定的數據塊,找到和他哈希值相同的數據塊極爲困難。再者,對於一個數據塊,哪怕改動他的一個比特位,其哈希值的改動也會非常的大----這正是hash存在的價值。
儘管可能性極小,但仍然可能會發生,如果hash衝突了,java的hashmap會在數組的同一個位置上增加鏈表。如果鏈表的長度大於8.將會進行紅黑樹處理---這就是所謂的拉鍊法(數組加鏈表)。

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