国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

說一說java.util.Arrays$ArrayList

linkin / 1522人閱讀

摘要:值得注意的是,的迭代器是否要調(diào)用方法是由要刪除的目標是否數(shù)組的元素決定的,如果不存在這樣的元素,則下面的代碼并不會出現(xiàn)異常,

java.util.Arrays$ArrayList(下文:Arrays$ArrayList)是java.util.Arrays的私有靜態(tài)內(nèi)部類,他實現(xiàn)的接口,繼承的父類幾乎和java.util.ArrayList(下文:ArrayList)相同,既然是私有的,那么平常應(yīng)該是我們少關(guān)注的地方。本文嘗試對比一兩個他們之間的不同點。

使用場景對比

構(gòu)造擁有三個字符串的List
ArrayList

List lb = new ArrayList<>(3);
        lb.add("a");
        lb.add("b");
        lb.add("c");

Arrays$ArrayList

List la = Arrays.asList("a", "b", "c");
//源碼
public static  List asList(T... a) {
        return new ArrayList<>(a);
    }

兩者都滿足了需求,后者看起來比前者簡潔,除此之外兩者還有什么不同呢。

增加刪除操作對比

支持的操作,

lb.add("d")
lb.remove("d")

不支持的操作,這將會拋出異常java.lang.UnsupportedOperationException

la.add("d")
la.remove("d")

可見Arrays$ArrayList不允許增加也不允許刪除。

具體的add方法

Arrays$ArrayList類,
首先并沒有override父類的add方法,所以這個方法來自他的父類AbstractList
AbstractList中的add方法

    public boolean add(E e) {
        add(size(), e);
        return true;
    }
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }    

最終調(diào)用的方法拋出了異常UnsupportedOperationException
相比較ArrayList

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
    public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }    

這兩個方法都在ArrayList中實現(xiàn)了,或者擴容然后在尾部插入,或者擴容、移動數(shù)組元素,然后插入到指定的下標位置。

具體的remove方法

Arrays$ArrayListremove(Object)方法繼承自AbstractList的父類AbstractCollection,其中

    public boolean remove(Object o) {
        Iterator it = iterator();
        if (o==null) {
            while (it.hasNext()) {
                if (it.next()==null) {
                    it.remove();
                    return true;
                }
            }
        } else {
            while (it.hasNext()) {
                if (o.equals(it.next())) {
                    it.remove();
                    return true;
                }
            }
        }
        return false;
    }

這里使用了迭代器的方式進行刪除,看這個方法的注釋


如果這個迭代器沒有實現(xiàn)remove方法的話,那么這整個方法也將要拋出UnsupportedOperationException異常的。
AbstractCollectioniterator是一個抽象方法,之于Arrays$ArrayList,這個方法實現(xiàn)的位置還是在AbstractList

    public Iterator iterator() {
        return new Itr();
    }
    private class Itr implements Iterator {
        //...省略
        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();

            try {
                AbstractList.this.remove(lastRet);
                if (lastRet < cursor)
                    cursor--;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException e) {
                throw new ConcurrentModificationException();
            }
        }    
    }

到這里我們發(fā)現(xiàn)AbstractList實現(xiàn)了AbstractCollectioniterator方法,而且返回的迭代器也實現(xiàn)了remove方法,不是上文提到的注釋那種情況。但是為什么刪除動作還是不允許的呢?
具體這個迭代器的remove方法,

AbstractList.this.remove(lastRet);

可見迭代器最終也是調(diào)用容器類的remove方法的,那么Arrays$ArrayList沒有實現(xiàn)remove方法,而AbstractListremove方法,如下

    public E remove(int index) {
        throw new UnsupportedOperationException();
    }

因此,即使在AbstractList中使用迭代器進行刪除操作,但由于Arrays$ArrayList沒有實現(xiàn)remove且繼承的remove拋出UnsupportedOperationException異常,最終在Arrays$ArrayList是不允許刪除操作的。

值得注意的是,AbstractList的迭代器是否要調(diào)用remove(int)方法是由要刪除的目標是否數(shù)組的元素決定的,如果不存在這樣的元素,則下面的代碼并不會出現(xiàn)異常,

List la = Arrays.asList("a", "b", "c");
la.remove("e");

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/68920.html

相關(guān)文章

  • 數(shù)組和列表的轉(zhuǎn)換問題

    摘要:以下指代數(shù)組,指代數(shù)組列表。常見的轉(zhuǎn)換方法是或。在的使用過程中需要注意,當(dāng)要轉(zhuǎn)換的長度小于的時,不要試圖通過傳入形參的方式進行轉(zhuǎn)換,雖然這在的長度大于時不會出現(xiàn)問題。所以,極度建議在轉(zhuǎn)換之前初始化的長度為的,并且使用返回值重新給賦值。 Array 和 List 都是我們在開發(fā)過程中常見的數(shù)據(jù)結(jié)構(gòu)。我們都知道 Array 是定長的,List 是可變長。而且,List 的實現(xiàn)類 Array...

    ChristmasBoy 評論0 收藏0
  • Java程序員常犯的10個錯誤

    摘要:原文出自本文總結(jié)了程序員常犯的個錯誤。可以看看為什么在中被設(shè)計成不可變父類和子類的構(gòu)造函數(shù)以上這段代碼出現(xiàn)編譯錯誤,因為默認的父類構(gòu)造函數(shù)未定義。如果程序員定義構(gòu)造函數(shù),編譯器將不插入默認的無參數(shù)構(gòu)造函數(shù)。 原文出自:http://www.programcreek.com/2014/05/top-10-mistakes-java-developers-make/ 本文總結(jié)了J...

    Andrman 評論0 收藏0
  • Java編程基礎(chǔ)17——集合(List集合)

    1_(去除ArrayList中重復(fù)字符串元素方式)* A:案例演示 需求:ArrayList去除集合中字符串的重復(fù)值(字符串的內(nèi)容相同) 思路:創(chuàng)建新集合方式 import java.util.ArrayList; import java.util.Iterator; public class ArrayList_1_demo { /* 創(chuàng)建新集合將重復(fù)元素去掉 * 1.明...

    scola666 評論0 收藏0
  • JAVA學(xué)習(xí)之路 (十)集合

    摘要:集合中的集合是一種工具類,就像是容器,存儲任意數(shù)量的具有共同屬性的對象集合的作用在類的內(nèi)部,對數(shù)據(jù)進行組織簡單而快速的搜索大量數(shù)目的條目有的集合接口,提供了一系列排列有序的元素,并且可以在序列中進行快速的插入和刪除有些集合接口,提供了映射關(guān) 集合 java中的集合: 是一種工具類,就像是容器,存儲任意數(shù)量的具有共同屬性的對象 集合的作用 1. 在類的內(nèi)部,對數(shù)據(jù)進行組織 2. 簡單而快...

    sutaking 評論0 收藏0
  • Stream流與Lambda表達式(一) 雜談

    摘要:一流轉(zhuǎn)換為數(shù)組集合陳楊將流轉(zhuǎn)換為數(shù)組將流轉(zhuǎn)換為數(shù)組將流轉(zhuǎn)換為集合將流轉(zhuǎn)換為集合解析 一、流 轉(zhuǎn)換為數(shù)組、集合 package com.java.design.java8.Stream; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context...

    Harpsichord1207 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<