摘要:值得注意的是,的迭代器是否要調(diào)用方法是由要?jiǎng)h除的目標(biāo)是否數(shù)組的元素決定的,如果不存在這樣的元素,則下面的代碼并不會(huì)出現(xiàn)異常,
java.util.Arrays$ArrayList(下文:Arrays$ArrayList)是java.util.Arrays的私有靜態(tài)內(nèi)部類,他實(shí)現(xiàn)的接口,繼承的父類幾乎和java.util.ArrayList(下文:ArrayList)相同,既然是私有的,那么平常應(yīng)該是我們少關(guān)注的地方。本文嘗試對(duì)比一兩個(gè)他們之間的不同點(diǎn)。
使用場景對(duì)比構(gòu)造擁有三個(gè)字符串的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); }
兩者都滿足了需求,后者看起來比前者簡潔,除此之外兩者還有什么不同呢。
增加刪除操作對(duì)比支持的操作,
lb.add("d") lb.remove("d")
不支持的操作,這將會(huì)拋出異常java.lang.UnsupportedOperationException
la.add("d") la.remove("d")
可見Arrays$ArrayList不允許增加也不允許刪除。
具體的add方法在Arrays$ArrayList類,
首先并沒有override父類的add方法,所以這個(gè)方法來自他的父類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++; }
這兩個(gè)方法都在ArrayList中實(shí)現(xiàn)了,或者擴(kuò)容然后在尾部插入,或者擴(kuò)容、移動(dòng)數(shù)組元素,然后插入到指定的下標(biāo)位置。
具體的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; }
這里使用了迭代器的方式進(jìn)行刪除,看這個(gè)方法的注釋
如果這個(gè)迭代器沒有實(shí)現(xiàn)remove方法的話,那么這整個(gè)方法也將要拋出UnsupportedOperationException異常的。
在AbstractCollection中iterator是一個(gè)抽象方法,之于Arrays$ArrayList,這個(gè)方法實(shí)現(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實(shí)現(xiàn)了AbstractCollection的iterator方法,而且返回的迭代器也實(shí)現(xiàn)了remove方法,不是上文提到的注釋那種情況。但是為什么刪除動(dòng)作還是不允許的呢?
具體這個(gè)迭代器的remove方法,
AbstractList.this.remove(lastRet);
可見迭代器最終也是調(diào)用容器類的remove方法的,那么Arrays$ArrayList沒有實(shí)現(xiàn)remove方法,而AbstractList的remove方法,如下
public E remove(int index) { throw new UnsupportedOperationException(); }
因此,即使在AbstractList中使用迭代器進(jìn)行刪除操作,但由于Arrays$ArrayList沒有實(shí)現(xiàn)remove且繼承的remove拋出UnsupportedOperationException異常,最終在Arrays$ArrayList是不允許刪除操作的。
值得注意的是,AbstractList的迭代器是否要調(diào)用remove(int)方法是由要?jiǎng)h除的目標(biāo)是否數(shù)組的元素決定的,如果不存在這樣的元素,則下面的代碼并不會(huì)出現(xiàn)異常,
Listla = Arrays.asList("a", "b", "c"); la.remove("e");
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68920.html
摘要:以下指代數(shù)組,指代數(shù)組列表。常見的轉(zhuǎn)換方法是或。在的使用過程中需要注意,當(dāng)要轉(zhuǎn)換的長度小于的時(shí),不要試圖通過傳入形參的方式進(jìn)行轉(zhuǎn)換,雖然這在的長度大于時(shí)不會(huì)出現(xiàn)問題。所以,極度建議在轉(zhuǎn)換之前初始化的長度為的,并且使用返回值重新給賦值。 Array 和 List 都是我們?cè)陂_發(fā)過程中常見的數(shù)據(jù)結(jié)構(gòu)。我們都知道 Array 是定長的,List 是可變長。而且,List 的實(shí)現(xiàn)類 Array...
摘要:原文出自本文總結(jié)了程序員常犯的個(gè)錯(cuò)誤??梢钥纯礊槭裁丛谥斜辉O(shè)計(jì)成不可變父類和子類的構(gòu)造函數(shù)以上這段代碼出現(xiàn)編譯錯(cuò)誤,因?yàn)槟J(rèn)的父類構(gòu)造函數(shù)未定義。如果程序員定義構(gòu)造函數(shù),編譯器將不插入默認(rèn)的無參數(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.明...
摘要:集合中的集合是一種工具類,就像是容器,存儲(chǔ)任意數(shù)量的具有共同屬性的對(duì)象集合的作用在類的內(nèi)部,對(duì)數(shù)據(jù)進(jìn)行組織簡單而快速的搜索大量數(shù)目的條目有的集合接口,提供了一系列排列有序的元素,并且可以在序列中進(jìn)行快速的插入和刪除有些集合接口,提供了映射關(guān) 集合 java中的集合: 是一種工具類,就像是容器,存儲(chǔ)任意數(shù)量的具有共同屬性的對(duì)象 集合的作用 1. 在類的內(nèi)部,對(duì)數(shù)據(jù)進(jìn)行組織 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...
閱讀 2866·2021-10-21 09:38
閱讀 2764·2021-10-11 10:59
閱讀 3057·2021-09-27 13:36
閱讀 1673·2021-08-23 09:43
閱讀 806·2019-08-29 14:14
閱讀 3044·2019-08-29 12:13
閱讀 3213·2019-08-29 12:13
閱讀 319·2019-08-26 12:24