JAVA_list总结
list,列表序列。是編程工作充常用的對象,類似數(shù)組,用于存儲統(tǒng)一類型的集合的對象。
先放結(jié)論:
| ArrayList | 數(shù)組 | 最常用,隨機訪問高效,插入刪除效率低 |
| LinkedList | 雙向鏈表 | 隨機訪問效率低,但隨機插入、隨機刪除效率低 |
| Vector | 數(shù)組 | 類似ArrayList,但線程安全 |
| Stack | 棧 | 它繼承于Vector,先進后出 |
ArrayList
首先,ArrayList的本質(zhì)是數(shù)組,在jdk1.8.0_121的java.util.ArrayList中,可以看到以下代碼
transient Object[] elementData; // non-private to simplify nested class access這就是ArrayList的本質(zhì),一個Object[],只不過,在add的時候,會自動的進行擴容而已。
public boolean add(E e) {ensureCapacityInternal(size + 1); // Increments modCount!!elementData[size++] = e;return true; }也因此:
推薦使用方法:
// ArrayList基本例子 List<String> arrayList = new ArrayList<String>(); arrayList.add("test1"); arrayList.add("test2"); arrayList.add("test3"); for (int i = 0; i < arrayList.size();i++){System.out.println(arrayList.get(i)); }LinkedList
源碼(jdk1.8.0_121):
transient Node<E> first;transient Node<E> last;private static class Node<E> {E item;Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;} }是的,這就是雙向鏈表,只保存首尾兩個節(jié)點,同時,每個節(jié)點保存其自身前后節(jié)點地址。也因此:
推薦使用方法:
// linkedList基本例子 List<String> linkedList = new LinkedList<String>(); linkedList.add("test1"); linkedList.add("test2"); linkedList.add("test3"); for (String data : linkedList){System.out.println(data); }另外,用于LinkedList的implements包含Deque,而Deque繼承Queue,所以LinkedList也可作為隊列來使用。
例子:
Vector
源碼(jdk1.8.0_121):
protected Object[] elementData;是的,和ArrayList一樣,Vector的本質(zhì)是一個數(shù)組,區(qū)別在于相關(guān)的方法:
public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true; }對,重點就是synchronized,因為Vector的方法都有synchronized,有了線程的保護,所以Vector是線程安全的。
Vector類似ArrayList,是線程安全的。知道這一點就足夠了。
** !但是! **
雖然Vector是線程安全的,但是想要使用線程安全的ArrayList的時候,簡易使用JUC集合類中的CopyOnWriteArrayList。
Stack
源碼(jdk1.8.0_121):
protected Object[] elementData;又來?是的,Stack的底層仍然是一個數(shù)組,但是相關(guān)的方法卻大不一樣。雖然由于繼承父類Vector,add這種方法還是存在,但是卻一般不用。一般使用的是以下方法:
public E push(E item) {addElement(item);return item; } public synchronized E pop() {E obj;int len = size();obj = peek();removeElementAt(len - 1);return obj; } public synchronized E peek() {int len = size();if (len == 0)throw new EmptyStackException();return elementAt(len - 1); }說明:
push:將元素推入棧中,通過將元素追加的數(shù)組的末尾中。
peek:取出棧頂元素,不執(zhí)行刪除,返回數(shù)組末尾的元素。
pop:取出棧頂元素,將該元素從棧中刪除,返回。
總之:
例子:
// stack基本例子 Stack<String> stack = new Stack<String>(); stack.push("test1"); stack.push("test2"); stack.push("test3"); for (int i = 0; i < 3;i++){System.out.println(stack.pop()); }轉(zhuǎn)載于:https://www.cnblogs.com/changfanchangle/p/8867445.html
總結(jié)
以上是生活随笔為你收集整理的JAVA_list总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVa 10375 - Choose a
- 下一篇: python开发基础教程