Java中數組、集合、鏈表、隊列的數據結構和優缺點和他們之間的區別數組
集合與數組的區別
我的分類: Java基礎
相同點:數組和集合類同是容器。
不一樣點 :1.數組的長度是固定的,集合的長度是可變的。
2.數組只能存儲同類型的對象,集合能夠存儲不一樣類型的對象。
3.集合只能存儲對象不能存儲基本類型安全
數組:
.長度固定
.能夠存儲基本類型,也能夠存儲引用類型
.存儲元素類型一致
數組能夠在內存中連續存儲多個元素的構造,在內存中的分配也是連續的
數組中的元素經過數組的下標進行訪問的,下標從0開始的
優勢 :
按照索引查詢元素速度快
按照索引遍歷數組方便
缺點:
數組的大小固定後就不能擴容了
數組只能存儲一種類型的數據
添加,刪除的操做慢,由於要移動其餘的元素
適用場景:
頻繁查詢,對存儲空間要求不大,不多增長和刪除的狀況數據結構
集合:
特色
長度可變
只能夠存儲引用類型
能夠存儲多種類型函數
List:有序、能夠有重複的集合
List 接口的三個典型實現:
①、List list1 = new ArrayList();
底層數據結構是數組,查詢快,增刪慢;線程不安全,效率高
②、List list2 = new Vector();
底層數據結構是數組,查詢快,增刪慢;線程安全,效率低,幾乎已經淘汰了這個集合
③、List list3 = new LinkedList();
底層數據結構是鏈表,查詢慢,增刪快;線程不安全,效率高
Set
HashSet:要保證元素惟一性,須要覆蓋掉Object中的equals和hashCode方法(由於底層是經過這兩個方法來判斷兩個元素是不是同一個)。線程
**TreeSet:**以二叉樹的結構對元素進行存儲,能夠對元素進行排序。
排序的兩種方式:
一、元素自身具有比較功能,元素實現Comparable接口,覆蓋compareTo方法。
二、創建一個比較器對象,該對象實現Comparator接口,覆蓋compare方法,並將該對象做爲參數傳給TreeSet的構造函數(能夠用匿名內部類)。
Map接口其特色是:元素是成對出現的,以鍵和值的形式體現出來,鍵要保證惟一性:經常使用類有:HashMap,Hashtable ,TreeMap。
HashMap:線程不安全等的,容許存放null鍵null值。
Hashtable:線程安全的,不容許存放null鍵null值。
TreeMap:能夠對鍵進行排序(要實現排序方法同TreeSet)。指針
鏈表:
經過一個鏈子把多個結點(元素)鏈接起來,由數據和地址組成的一個元素,
節點自己必須有一個地址值(就是下一個元素的地址值)
優勢:
鏈表是很經常使用的一種數據結構,不須要初始化容量,
能夠任意加減元素;
添加或者刪除元素時只須要改變先後兩個元素結點的指針域指向地址便可,
因此添加,刪除很快;
缺點:
由於含有大量的指針域,佔用空間較大;
查找元素須要遍歷鏈表來查找,
很是耗時。
適用場景:
數據量較小,須要頻繁增長,刪除操做的場景對象
隊列:
是一種先進先出的數據構造,也是運算受限制的線性表,只能夠在對頭刪除元素,在隊尾插入元素
線性表是同一類型數據的一個有限序列
元素之間的前後排列次序蘊涵着其線性關係。線性表中的第一個元素a1稱爲表頭元素,an稱爲表尾元素
隊列能夠分爲順序隊列和鏈式隊列,根據不一樣的存儲方式,定義的結構也不一樣。
順序隊列包含一個數組成員,有二端包含一個數組成員 咱們把刪除一端叫頭
插入一端叫尾
連接存儲的有序線性表類須要繼承連接線性表類LinkList和實現有序線性表接口SortedList排序
區別:
1.佔用的內存空間
鏈表存放的內存空間能夠是連續的,也能夠是不連續的,數組則是連續的一段內存空間。通常狀況下存放相同多的數據數組佔用較小的內存,而鏈表還須要存放其前驅和後繼的空間。
2.長度的可變性
鏈表的長度是按實際須要能夠伸縮的,而數組的長度是在定義時要給定的,若是存放的數據個數超過了數組的初始大小,則會出現溢出現象。
3.對數據的訪問
鏈表方便數據的移動而訪問數據比較麻煩;數組訪問數據很快捷而移動數據比較麻煩。
鏈表和數組的差別決定了它們的不一樣使用場景,若是須要不少對數據的訪問,則適合使用數組;若是須要對數據進行不少移位操做,則設和使用鏈表。繼承