表、栈和队列
抽象數據類型(abstract data type, ADT)是帶有一組操作的一些對象的集合。對于集合ADT, 可以有像添加(add)、刪除(remove)以及包含(contain)這樣一些操作。
?
ArrayList:插入和 刪除的花費存在潛在開銷。最壞的情況下,在位置0的插入,首先需要將整個數組后移一個位置以空出空間來,而刪除第一個元素則需要將表中的所有元素前移一個位置,因此這兩種操作最壞的情況是O(N)。
優勢: 查詢高效(可以直接find數組的index)
缺陷:插入刪除開銷大(需要將全部數組移位)
?
?
?
因此,為了避免插入和刪除的線性開銷,就引入了不連續存儲,增刪不需要整體移動的鏈表。
?
?
鏈表(LinkedList):鏈表由一系列節點組成,這些節點不必在內存中相連。每一個節點均含有表元素和包含該元素后繼元的節點的鏈(Link)。稱其為next鏈。最后一單元的next鏈引用null。
刪除 (remove)方法可以通過修改一個next引用來實現。插入(insert)方法需要使用new操作符從系統取得一個新節點,再修改next引用。
優勢: 查詢效率低(需要從頭開始遍歷)
缺陷:插入刪除高效(不需要全盤移位)
*刪除最后一項比較復雜,因為必須找出指向最后節點的項,把它的next鏈改成null,然后在更新持有最后節點的鏈。
?
?
for循環和迭代器Iterator對比:
??????? 采用ArrayList對隨機訪問比較快,而for循環中的get()方法,采用的即是隨機訪問的方法,因此在ArrayList里,for循環較快
??????? 采用LinkedList則是順序訪問比較快,iterator中的next()方法,采用的即是順序訪問的方法,因此在LinkedList里,使用iterator較快
從數據結構角度分析,for循環適合訪問順序結構,可以根據下標快速獲取指定元素.而Iterator 適合訪問鏈式結構,因為迭代器是通過next()和Pre()來定位的.可以訪問沒有順序的集合.
??????? 而使用 Iterator 的好處在于可以使用相同方式去遍歷集合中元素,而不用考慮集合類的內部實現(只要它實現了 java.lang.Iterable 接口),如果使用 Iterator 來遍歷集合中元素,一旦不再使用 List 轉而使用 Set 來組織數據,那遍歷元素的代碼不用做任何修改,如果使用 for 來遍歷,那所有遍歷此集合的算法都得做相應調整,因為List有序,Set無序,結構不同,他們的訪問算法也不一樣.(還是說明了一點遍歷和集合本身分離了)
?
?
棧(stack)是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫作棧的頂(top)。對棧的基本操作有push(進棧)和pop(出棧),前者相當于插入,后者則是刪除最后出入元素。棧又是又叫作LIFO(后進先出)表。(實現計算的過程)
?
?
?
隊列(queue)也是表。隊列的基本操作是enqueue(入隊),它是在表的末端(rear)插入一個元素,和dequeue(出隊),它是刪除在表的開頭的元素。
隊列操作:
?
轉載于:https://www.cnblogs.com/tangh4/p/10630964.html
總結