日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA_list总结

發(fā)布時間:2024/4/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA_list总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

list,列表序列。是編程工作充常用的對象,類似數(shù)組,用于存儲統(tǒng)一類型的集合的對象。
先放結(jié)論:

類型數(shù)據(jù)結(jié)構(gòu)特點描述
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; }

也因此:

  • 隨機訪問效率高(直接elementData[i]就可以取得對象)
  • 插入刪除慢(每次插入刪除,尤其是對非尾對象進行改變時,都會導(dǎo)致Object[] elementData結(jié)構(gòu)整個的變動)
  • 線程不安全(單純的數(shù)組,沒有做任何保護處理)
  • 推薦使用方法:

    // 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é)點地址。也因此:

  • 訪問效率低(非首尾節(jié)點時,只能從首尾節(jié)點開始,一個一個去尋找)
  • 插入刪除效率高(只需要創(chuàng)建或者刪除節(jié)點,并且調(diào)整相鄰節(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也可作為隊列來使用。
    例子:

    Queue<String> queue = new LinkedList<String>(); queue.add("test1"); queue.add("test2"); queue.add("test3"); System.out.println(queue.size()); for (int i = 0; i < 3;i++){System.out.println(queue.poll()); } System.out.println(queue.size()); // 結(jié)果: // 3 // test1 // test2 // test3 // 0

    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:取出棧頂元素,將該元素從棧中刪除,返回。
    總之:

  • 使用push插入,用peek或pop去除(符合堆棧特性)
  • 線程安全(使用synchronized)
  • 例子:

    // 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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。