JAVA中數據結構總結


本篇文章主要總結一下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就有利於節約內存空間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM