摘要:值得注意的是,的迭代器是否要調(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
Listlb = new ArrayList<>(3); lb.add("a"); lb.add("b"); lb.add("c");
Arrays$ArrayList
Listla = 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$ArrayList的remove(Object)方法繼承自AbstractList的父類AbstractCollection,其中
public boolean remove(Object o) { Iteratorit = 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異常的。
在AbstractCollection中iterator是一個抽象方法,之于Arrays$ArrayList,這個方法實現(xiàn)的位置還是在AbstractList,
public Iteratoriterator() { 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)了AbstractCollection的iterator方法,而且返回的迭代器也實現(xiàn)了remove方法,不是上文提到的注釋那種情況。但是為什么刪除動作還是不允許的呢?
具體這個迭代器的remove方法,
AbstractList.this.remove(lastRet);
可見迭代器最終也是調(diào)用容器類的remove方法的,那么Arrays$ArrayList沒有實現(xiàn)remove方法,而AbstractList的remove方法,如下
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)異常,
Listla = 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
摘要:以下指代數(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...
摘要:原文出自本文總結(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...
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.明...
摘要:集合中的集合是一種工具類,就像是容器,存儲任意數(shù)量的具有共同屬性的對象集合的作用在類的內(nèi)部,對數(shù)據(jù)進行組織簡單而快速的搜索大量數(shù)目的條目有的集合接口,提供了一系列排列有序的元素,并且可以在序列中進行快速的插入和刪除有些集合接口,提供了映射關(guān) 集合 java中的集合: 是一種工具類,就像是容器,存儲任意數(shù)量的具有共同屬性的對象 集合的作用 1. 在類的內(nèi)部,對數(shù)據(jù)進行組織 2. 簡單而快...
摘要:一流轉(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...
閱讀 2845·2021-10-21 09:38
閱讀 2751·2021-10-11 10:59
閱讀 3022·2021-09-27 13:36
閱讀 1649·2021-08-23 09:43
閱讀 791·2019-08-29 14:14
閱讀 3034·2019-08-29 12:13
閱讀 3203·2019-08-29 12:13
閱讀 310·2019-08-26 12:24