本篇文章主要總結一下JAVA中實現的幾種數據結構
簡述:
List<?>:鏈表結構。
Queue<?>:隊列,只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作,隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。
Map<?,?>:用於存放鍵值對數據,鍵值對存儲在Entry<?, ?>,不能存儲重復的key值,相同的key值時,后面的value覆蓋前面的value,key值允許為空。
Set<?>:由Map封裝實現,結構特性和Map一致,但是只能存儲單對象。
涉及到的數據結構:
棧:提供壓棧(push)和出棧(pop)功能
隊列:提供offer和pull的非阻塞方法,put和take的阻塞方法
鏈表:提供添加、查找、移除、遍歷等各種函數
樹:紅黑樹,通常用來做隨機查找,取Top N或排序等功能
線程安全性
Queue、Vector、Stack、HashTable、ConcurrentHashMap是線程安全的,其余都是不安全的,后面新開一遍介紹Java的鎖,將會深入講解。
時間復雜度
List篇
順序存儲結構:在內存中開辟若干的連續空間,將每個空間存入數據,數據關聯與其地址一致。
優點:1無需為表示表中元素之間的邏輯關系而添加空間
2可以快速地存取表中任意位置的元素
缺點:1插入和刪除操作需要移動大量元素
2需要考慮索引越界為題
3擴容空間可能會造成空間浪費,縮小空間又可能會索引越界
4null值會造成空間“碎片”
鏈式存儲結構:
優點:插入和刪除操作只需改變節點next和prev成員的指向即可,無需移位,無需擴容
缺點:失去了直接存取表中任意位置元素的能力
1、存儲分配方式:
順序存儲結構使用一段連續的存儲單元依次存儲線性表元素
鏈式存儲結構使用任意存儲單元存放線性表的元素
2、時間性能:
查找:
順序存儲結構O(1)
鏈式存儲結構O(n)
插入和刪除:
順序存儲結構O(n)
鏈式存儲結構O(1)
3、空間性能:
順序存儲結構:空間分大了浪費,分小了上溢,還得擴容
鏈式存儲結構:有空間就能分配,元素個數不受限制
言歸正傳。
ArrayList是順序存儲的線性表,LinkedList是鏈式存儲的線性表
它們的特點都是有序,元素值可以重復。區別是底層算法不同。
Vector,這里我簡單瀏覽了一下源代碼,Vector底層算法和ArrayList是一樣的
這里就不贅述了,直接說區別:
1、Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe),而ArrayList的方法線程不安全,由於線程的同步必然要影響性能,因此ArrayList的性能比Vector好。
2、Vector擴容時容量翻倍,而ArrayList只增加50%的大小,(直接查它們的grow()方法)這樣,ArrayList就有利於節約內存空間。