ArrayList 实现 iterator()

合集下载

遍历list集合的方法

遍历list集合的方法

遍历list集合的方法
提到list集合,很多人都不知道如何遍历它们。

其实,遍历list集合有很多种方法,这里我们来看一下。

1. for循环:for循环是最常用的遍历list集合的方法,使用for循环可以实现对list集合中的每一个元素的遍历,这是最常用的集合遍历方法。

2. while循环:while循环也可以用于遍历list集合,但是相对于for循环,while循环需要更多的控制语句,使用while循环遍历list集合也是可行的。

3. Iterator:Iterator是一种非常强大的遍历list集合的方式,它可以实现对list集合中的每个元素的遍历,而且不会出现重复遍历的情况。

Iterator也可以用于将list集合转换成其他类型的集合,比如Set类型的集合。

4. forEach():forEach()是JDK8中的新增方法,它可以实现对list 集合中的每个元素的遍历,而且可以接受一个lambda表达式作为参数,使用forEach()方法可以实现更加简洁和优雅的遍历list集合。

以上就是遍历list集合的几种方法,它们各有优缺点,你可以根据实际情况来选择最适合自己的遍历方法。

java中的ArrayList使得集合中的对象不重复

java中的ArrayList使得集合中的对象不重复

java中的ArrayList使得集合中的对象不重复JAVA中的List接⼝存放的元素是可以重复的,在这个我重写对象⾥⾯的equals()⽅法,让集合⾥存放的对象不能重复⾸先建⼀个类,在⾥⾯的main()⽅法中实现list1中存放的是可以重复对象的集合,在新建了⼀个newlist,⾥⾯存放不能重复对象的集合在迭代器中实现判断和存对象到newlist中。

新建的⼀个Man类,⽤于封装属性和重写equals()⽅法,实现两个对象的属性⼀样时,即判定为同⼀个对象package com.tercher.demo;import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class EqualsArray {/** List集合中允许存⼊重复的元素,所以,* 要使得集合中没有重复的元素,需要重写类的equals()⽅法*/public static void main(String[] args) {List list1 = new ArrayList();list1.add(new Man("json", "nan"));list1.add(new Man("json", "nan"));list1.add(new Man("json", "nv"));list1.add(new Man("nana", "nv"));ArrayList newlist = new ArrayList();Iterator iter = list1.iterator();//通过迭代器判断是否相等,并不同的对象加⼊新的集合中/**ArrayList中的contain()⽅法,是查看集合是否包含此对象。

listiterator用法

listiterator用法

listiterator用法
ListIterator用法
1、ListIterator是List接口的迭代器;
2、ListIterator可以正反向遍历List;
3、使用ListIterator时,使用前需要调用List集合的listIterator()方法返
回ListIterator对象;
4、ListIterator有4个核心方法:hasNext()、next()、hasPrevious()、previous,可以用于正反向遍历List。

5、add()方法可以用来向前面和后面添加元素;
6、remove()方法可以删除元素;
7、set()方法可以用来设置List中的某一个元素;
8、nextIndex()、previousIndex()方法返回当前元素所在下标位置;
9、用法和普通的迭代器Iterator相类似,只是能够正反向遍历。

ListIterator的优势:
1、可以正反向遍历List,它可以利用hasPrevious()和previous()方法,
模仿像Iterator一样的反向遍历;
2、可以向前面和后面添加元素;
3、可以删除元素;
4、可以设置List中的某一个元素;
5、更加的灵活,可以更好的控制流程,添加元素不会影响原有的元素;
6、性能更优,低效存储,可以进行高效的操作;
7、它可以实现List特有的方法,和Iterator则不能实现。

java.util.ConcurrentModificationException异常问题详解

java.util.ConcurrentModificationException异常问题详解

java.util.ConcurrentModificationException异常问题详解环境:JDK 1.8.0_111在Java开发过程中,使⽤iterator遍历集合的同时对集合进⾏修改就会出现java.util.ConcurrentModificationException异常,本⽂就以ArrayList为例去理解和解决这种异常。

⼀、单线程情况下问题分析及解决⽅案1.1 问题复现先上⼀段抛异常的代码。

1public void test1() {2 ArrayList<Integer> arrayList = new ArrayList<>();3for (int i = 0; i < 20; i++) {4 arrayList.add(Integer.valueOf(i));5 }67// 复现⽅法⼀8 Iterator<Integer> iterator = arrayList.iterator();9while (iterator.hasNext()) {10 Integer integer = iterator.next();11if (integer.intValue() == 5) {12 arrayList.remove(integer);13 }14 }1516// 复现⽅法⼆17 iterator = arrayList.iterator();18for (Integer value : arrayList) {19 Integer integer = iterator.next();20if (integer.intValue() == 5) {21 arrayList.remove(integer);22 }23 }24 }在这个代码中展⽰了两种能抛异常的实现⽅式。

1.2、问题原因分析先来看实现⽅法⼀,⽅法⼀中使⽤Iterator遍历ArrayList,抛出异常的是iterator.next()。

java iterator用法

java iterator用法

java iterator用法Java中,如果需要对一个数据集合进行遍历,通常可以使用Iterator来实现。

Iterator能够逐个访问数据集合中的元素,并且提供了删除元素的操作。

下面我们来详细了解一下Java中Iterator的用法。

第一步,获取Iterator对象要使用Iterator,首先需要获得Iterator对象。

获取Iterator对象的方法通常是调用数据集合的iterator()方法,例如:```List<String> list = new ArrayList<>();Iterator<String> iterator = list.iterator();```其中list为数据集合,iterator()方法返回的对象就是Iterator对象。

第二步,使用next()方法访问元素Iterator对象提供了一个next()方法,该方法能够逐个访问数据集合中的元素。

next()方法返回当前元素并移动指针到下一个元素。

例如:```while (iterator.hasNext()) {String element = iterator.next();System.out.println(element);}```其中hasNext()方法用于判断是否还有下一个元素,如果有则返回true,否则返回false。

next()方法用于返回当前元素,同时将指针移动到下一个元素。

第三步,删除元素除了访问元素外,Iterator对象还提供了一个remove()方法,用于删除当前元素。

例如:```iterator.remove();```需要注意的是,如果在调用remove()方法前没有调用next()方法,则会抛出IllegalStateException异常;如果已经删除了元素,则不能再次调用remove()方法,否则也会抛出异常。

完整代码示例如下:```List<String> list = new ArrayList<>();list.add("A");list.add("B");list.add("C");Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String element = iterator.next();if ("B".equals(element)) {iterator.remove();} else {System.out.println(element);}}```运行结果为:```AC```从上面的代码可以看出,使用Iterator能够方便地对数据集合进行遍历和删除操作。

arraylistjava中的用法

arraylistjava中的用法

arraylistjava中的用法ArrayList是Java集合框架中的一个重要类,它提供了一个动态数组的实现,可以方便地添加、删除和访问元素。

本文将详细介绍ArrayList在Java中的用法,包括其基本概念、创建、使用、常见操作以及注意事项。

一、基本概念ArrayList是Java中的一个动态数组,它继承自AbstractList类,实现了List接口。

ArrayList提供了一些常用的方法,如add、remove、get和iterator 等,可以方便地添加、删除、访问和遍历数组中的元素。

ArrayList的特点是存储元素的方式非常灵活,可以根据需要动态调整数组的大小,从而避免了在添加或删除大量元素时频繁创建和销毁数组所导致的问题。

二、创建ArrayList对象要创建一个ArrayList对象,可以使用以下语法:```javaArrayList<E> arrayList = new ArrayList<E>();```其中,E代表一个泛型类型,用于指定ArrayList中元素的类型。

如果不需要指定元素类型,可以使用通配符语法:```javaArrayList<Object> arrayList = new ArrayList<>();```三、使用ArrayList对象使用ArrayList对象非常简单,只需要调用其提供的方法即可。

例如,要向ArrayList中添加一个元素,可以使用add()方法:```javaarrayList.add(element);```要访问ArrayList中的元素,可以使用get()方法:```javaelement = arrayList.get(index);```其中,index表示要访问的元素的索引。

要遍历ArrayList中的所有元素,可以使用迭代器(Iterator)对象:```javaIterator<E> iterator = arrayList.iterator();while (iterator.hasNext()) {element = iterator.next();// 处理元素}```四、常见操作1. 添加元素:使用add()方法向ArrayList中添加元素。

JAVAArrayList详细介绍(示例)

JAVAArrayList详细介绍(示例)

JAVAArrayList详细介绍(⽰例)ArrayList 是⼀个数组队列,相当于动态数组。

与Java中的数组相⽐,它的容量能动态增长。

它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接⼝。

ArrayList 继承了AbstractList,实现了List。

它是⼀个数组队列,提供了相关的添加、删除、修改、遍历等功能。

ArrayList 实现了RandmoAccess接⼝,即提供了随机访问功能。

RandmoAccess是java中⽤来被List实现,为List提供快速访问功能的。

在ArrayList中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。

稍后,我们会⽐较List的“快速随机访问”和“通过Iterator迭代器访问”的效率。

ArrayList 实现了Cloneable接⼝,即覆盖了函数clone(),能被克隆。

ArrayList 实现java.io.Serializable接⼝,这意味着ArrayList⽀持序列化,能通过序列化去传输。

和Vector不同,ArrayList中的操作不是线程安全的。

所以,建议在单线程中才使⽤ArrayList,⽽在多线程中可以选择Vector或者CopyOnWriteArrayList。

复制代码代码如下:// 默认构造函数ArrayList()// capacity是ArrayList的默认容量⼤⼩。

当由于增加数据导致容量不⾜时,容量会添加上⼀次容量⼤⼩的⼀半。

ArrayList(int capacity)// 创建⼀个包含collection的ArrayListArrayList(Collection<? extends E> collection)ArrayList的API复制代码代码如下:// Collection中定义的APIboolean add(E object)boolean addAll(Collection<? extends E> collection)void clear()boolean contains(Object object)boolean containsAll(Collection<?> collection)boolean equals(Object object)int hashCode()boolean isEmpty()Iterator<E> iterator()boolean remove(Object object)boolean removeAll(Collection<?> collection)boolean retainAll(Collection<?> collection)int size()<T> T[] toArray(T[] array)Object[] toArray()// AbstractCollection中定义的APIvoid add(int location, E object)boolean addAll(int location, Collection<? extends E> collection)E get(int location)int indexOf(Object object)int lastIndexOf(Object object)ListIterator<E> listIterator(int location)ListIterator<E> listIterator()E remove(int location)E set(int location, E object)List<E> subList(int start, int end)// ArrayList新增的APIObject clone()void ensureCapacity(int minimumCapacity)void trimToSize()void removeRange(int fromIndex, int toIndex)为了更了解ArrayList的原理,下⾯对ArrayList源码代码作出分析。

collection&&map

collection&&map

1.集合ArrayList = Object[ ] + 数组的线性(List)操作StringBuilder/String = char [ ] + 操作Date/Calendar=long +操作2.泛型List<Node> nodes = new ArrayList()HashMap<String,Double> hashMap = new HashMap<String,Double>() 面向接口编程,在内存堆中创建一个B对象,在内存栈中创建一个引用A,A 指向B。

用A中的s.print()方法去调用B中的同名方法,这当然是正确的,因为B类实现了A接口。

所谓的面向接口编程可以降低程序之间的耦合度,是指在具体的调用处都是接口进行的,并不依赖于具体类,在A s = new B;中,B可以被任意实现了接口A的其他类替换掉。

3.容器类:Collection(集合)Map(映像)集合接口:Collection,Set,List Map接口:MapCollection1)Collection接口几种基本方法:boolean add(Object obj)boolean addAll( Collection col)将另一个Collection对象中的所有元素插入到该Collection对象中,当目标Collection对象改变后,它返回true;Iterator iterator() 返回一个Iterator(遍历器)接口对象con2.retainAll(con1) 返回值是Boolean类型。

仅在con2中保留con1中包含的值2)List是Collection的子接口,保存有序的可重复的对象◆List中的某些方法:toArray():List转换为数组List list=Arrays.asList();返回一个受指定数组支持的固定大小的列表◆实现List接口的类:ArrayList,LinkedList,Vectora)ArrayList中常用方法:add( )addAll( )<E>get(int index ) 返回此列表中指定位置上的元素<E>set(int idx,E el)用指定的元素替代此列表中指定位置上的元素返回值是被替换掉的元素remove()eg://将第一个和第三个值交换list1.set(0,list1.set(2,list1.get(0)));也可以写成Object temp = list1.get(0);list1.set(0,list1.get(2));list1.set(2,temp);b)ArrayList(新) 与 Vector(旧)区别都是采用数组形式存放对象,Vector线程安全,数组容量成倍增长,ArrayList非线程安全,采用50%方式增长,交Vector快c)ArrayList与LinkedList区别ArrayList用数组的方式存取对象,存放位置连续,方便查,缺点:进行增删改较麻烦。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ArrayList 实现iterator()ArrayList 实现iterator()2011年08月15日星期一22:052011-08-25 22:05ArrayList 实现ArrayList是List接口的一个可变长数组实现。

实现了所有List接口的操作,并允许存储null值。

除了没有进行同步,ArrayList基本等同于Vector。

在Vector中几乎对所有的方法都进行了同步,但ArrayList仅对writeObject和readObject 进行了同步,其它比如add(Object)、remove(int)等都没有同步。

1.存储ArrayList使用一个Object的数组存储元素。

private transient Object elementData[];ArrayList实现了java.io.Serializable接口,这儿的transient 标示这个属性不需要自动序列化。

下面会在writeObject()方法中详细讲解为什么要这样作。

2.add和removeJava代码public boolean add(Object o) {ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = o;return true;}public boolean add(Object o) {ensureCapacity(size + 1); // Increments modCount!!elementData[size++] = o;return true;}注意这儿的ensureCapacity()方法,它的作用是保证elementData数组的长度可以容纳一个新元素。

在&#8220;自动变长机制&#8221;中将详细讲解。

Java代码public Object remove(int index) {RangeCheck(index);modCount++;Object oldValue = elementData[index];int numMoved = size - index - 1;if (numMoved &gt; 0)System.arraycopy(elementData, index+1, elementData, index, numMoved);elementData[--size] = null; // Let gc do its workreturn oldValue;}public Object remove(int index) {RangeCheck(index);modCount++;Object oldValue = elementData[index];int numMoved = size - index - 1;if (numMoved &gt; 0)System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--size] = null; // Letgc do its workreturn oldValue;}RangeCheck()的作用是进行边界检查。

由于ArrayList采用一个对象数组存储元素,所以在删除一个元素时需要把后面的元素前移。

删除一个元素时只是把该元素在elementData数组中的引用置为null,具体的对象的销毁由垃圾收集器负责。

modCount的作用将在下面的&#8220;iterator()中的同步&#8221;中说明。

注:在前移时使用了System提供的一个实用方法:arraycopy(),在本例中可以看出System.arraycopy()方法可以对同一个数组进行操作,这个方法是一个native方法,如果对同一个数组进行操作时,会首先把从源部分拷贝到一个临时数组,在把临时数组的元素拷贝到目标位置。

3.自动变长机制在实例化一个ArrayList时,你可以指定一个初始容量。

这个容量就是elementData数组的初始长度。

如果你使用:ArrayList list = new ArrayList(); 则使用缺省的容量:10。

public ArrayList() {this(10);} ArrayList提供了四种add()方法,Java代码public boolean add(Object o)public void add(int index, Object element)public boolean addAll(Collection c)public boolean addAll(int index, Collection c)public boolean add(Object o)public void add(int index, Object element)public boolean addAll(Collection c)public boolean addAll(int index, Collection c)在每一种add()方法中,都首先调用了一个ensureCapacity(int miniCapacity)方法,这个方法保证elementData数组的长度不小于miniCapacity。

ArrayList的自动变长机制就是在这个方法中实现的。

Java代码public void ensureCapacity(int minCapacity) { modCount++;int oldCapacity = elementData.length;if (minCapacity &gt; oldCapacity) {Object oldData[] = elementData;int newCapacity = (oldCapacity * 3)/2 + 1;if (newCapacity &lt; minCapacity)newCapacity = minCapacity;elementData = new Object[newCapacity]; System.arraycopy(oldData, 0, elementData, 0, size); }}public void ensureCapacity(int minCapacity) {modCount++;int oldCapacity = elementData.length;if (minCapacity &gt; oldCapacity) {Object oldData[] = elementData;int newCapacity = (oldCapacity * 3)/2 + 1;if (newCapacity &lt; minCapacity)newCapacity = minCapacity;elementData = newObject[newCapacity];System.arraycopy(oldData, 0, elementData, 0, size);}}从这个方法实现中可以看出ArrayList每次扩容,都扩大到原来大小的1.5倍。

每种add()方法的实现都大同小异,下面给出add(Object)方法的实现:Java代码public boolean add(Object o) {ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = o;return true;}public boolean add(Object o) {ensureCapacity(size + 1); // Increments modCount!!elementData[size++] = o;return true;}4.iterator()中的同步在父类AbstractList中定义了一个int型的属性:modCount,记录了ArrayList结构性变化的次数。

protected transient int modCount = 0; 在ArrayList的所有涉及结构变化的方法中都增加modCount的值,包括:add()、remove()、addAll()、removeRange()及clear()方法。

这些方法每调用一次,modCount的值就加1。

注:add()及addAll()方法的modCount的值是在其中调用的ensureCapacity()方法中增加的。

AbstractList中的iterator()方法(ArrayList直接继承了这个方法)使用了一个私有内部成员类Itr,生成一个Itr对象(Iterator接口)返回:public Iterator iterator() {return new Itr();} Itr实现了Iterator()接口,其中也定义了一个int型的属性:expectedModCount,这个属性在Itr类初始化时被赋予ArrayList对象的modCount属性的值。

int expectedModCount = modCount; 注:内部成员类Itr也是ArrayList类的一个成员,它可以访问所有的AbstractList的属性和方法。

理解了这一点,Itr类的实现就容易理解了。

在Itr.hasNext()方法中:public boolean hasNext() {return cursor != size();} 调用了AbstractList的size()方法,比较当前光标位置是否越界。

在Itr.next()方法中,Itr也调用了定义在AbstractList 中的get(int)方法,返回当前光标处的元素:Java代码public Object next() {try {Object next = get(cursor); checkForComodification();lastRet = cursor++;return next;} catch(IndexOutOfBoundsException e) { checkForComodification();throw new NoSuchElementException();}}public Object next() {try {Object next = get(cursor);checkForComodification();lastRet = cursor++;return next;}catch(IndexOutOfBoundsException e) {checkForComodification();throw newNoSuchElementException();}}注意,在next()方法中调用了checkForComodification()方法,进行对修改的同步检查:Java代码final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}现在对modCount和expectedModCount的作用应该非常清楚了。

相关文档
最新文档