java中集合框架其實就是數據結構的實現的封裝;
參考資料:任小龍教學視頻
1,什么是數據結構?
數據結構是計算機存儲,組織數據的方式;
數據結構是指相互之間存在一種或多種特定關系的數據元素的集合;
通常情況下,精心選擇的數據結構可帶來更高的運行或者存儲效率,
數據結構往往同高效的檢索算法和索引技術有關;
2,數據結構的基本功能
增(Create) 刪(Delete) 改(Update) 查(Read)
3,常見的數據結構
3.1,數組Array;
數組是最簡單的數據結構;是用來存放同一種數據類型的集合.
從增刪改查分析數組的性能:
增:在數組的最后一個位置添加元素是很方便的,但是要是想在第一個位置添加元素就很麻煩了,后面的所有元素都要整體后移,容量不夠還要進行擴容;
刪:把數組的最后一個元素刪除是很方便的,但是要刪除第一個位置的元素就很麻煩,后面的所有元素都要整體前移;
改:修改指定下標的元素只要操作一次即可;
查:如果查詢指定下標的元素只要操作一次即可,如果查詢指定元素的下標,此時需要使用線性搜索(挨個找),
綜上:數組的改查性能比較高,增刪性能比較低;
3.2鏈表Linked List;
鏈表是通過引用來表示上一個節點和下一個節點的關系;
1》單點鏈表// 只能從頭遍歷到尾/只能從尾遍歷到頭
通過next存儲下一個節點,Node next表示的就是下一個節點;
2》雙向列表// 既可以從頭遍歷到尾,也能從尾遍歷到頭
通過prev表示上一個節點,Node prev表示的是上一個節點;
從增刪改查分析鏈表的性能:
增:雙向鏈表可以直接獲取第一個節點和最后一個節點.如果新增的元素在第一個位置或者最后一個位置,則操作只有一次;
刪:把第一個元素或者最后一個元素刪除只要操作一次;
改:不存在下標的概念,需要進行遍歷;
查:不存在下標的概念,需要進行遍歷;
綜上:鏈表的增刪性能較高,改查性能較低;
3.3棧Stack;
是一種運算受限的線性表,后進先出(LIFO);
僅允許在列表的一端添加和刪除元素,這一端被稱為棧頂,相對的把另一端稱為棧底
向一個棧中添加元素,又稱為壓棧或者進棧或者入棧,他是把新元素放在棧頂元素的上面,使之成為新的棧頂元素;
從一個棧刪除元素,又稱之為出棧,他是把棧頂元素刪掉,使之相鄰的元素成為棧頂元素;
棧是基於數組實現的,下標為0的元素就是棧底元素,最后一個元素就是棧頂元素;
3.4隊列Queue;
隊列是一種特殊的線性表,特殊之處在於,只允許表的前端進行刪除操作,表的后端進行添加操作
和棧一樣,隊列是一種受限的線性表
進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭;
單向隊列:先進先出(FIFO)只能從隊列尾插入數據,只能從隊列頭刪除數據;
雙向隊列:既可以從隊列尾/頭插入數據,也可以從隊列頭/尾刪除數據;
3.5哈希表Hash
在一般的數組中,元素在數組中的下標位置是隨機的,元素的取值和元素的位置之間存在不確定的關系;
因此數組在查找值時,需要把查找值和一系列的元素進行比較;此時的查詢效率依賴於查找過程中所進行的比較次數;
如果元素的值(value)和數組中的下標(index)有一個確定的對應關系(hash),
公式:index = hash(value);
這樣的數組就稱之為哈希表,哈希表最大的用處就是提供查找數據的效率;
一般情況不會把哈希碼(hashCode)作為數組元素的下標,因為哈希碼較大,容易越界;可以在哈希碼和下標之間做映射關系,
數組會記錄元素的添加順序,並且允許元素重復;
哈希表不會記錄元素的添加順序(哈希算法進行排序使之一一對應),不允許重復,原因是:如果元素重復,導致哈希碼值相等,導致下標相等