List集合 10/10

List集合

概述

public interface List<E> extends Collection<E>
  • 有序集合(也称为序列 )。 该界面的用户可以精确控制列表中每个元素的插入位置。 用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。

  • 与Set集合不同,列表通常允许重复的元素。

特点:

  • 有序:储存和取出的元素顺序一致

  • 元素可重复

使用方法

List<String> l = new ArrayList<String>();        //以多态的方式创建对象

常用方法

  • 该接口继承至Collection集合,在拥有Collection集合的全部方法的同时:

List 集合特有的方法
​
void add(int Index , E e)          //在指定位置插入指定元素(原有元素之前)
E remove(int Index)                //删除指定索引处的元素,返回被删除的元素
E set(int index,E e)               //修改指定索引处的元素,返回被修改的元素      
E get(int index)                   //返回指定的索引处的值

遍历方法

  • 采用Collection集合中也有的: Iterator() 方法进行遍历

  • 采用set()与get()方法,for循环

//get()方法
for(int i = 0 ; i<list.size();i++){
    String s = list.get(i);
    System.out.println(s);
}

并发修改异常

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
​
public class demo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
​
        list.add("hello");
        list.add("java");
        list.add("world");
​
        Iterator<String> it = list.listIterator();
​
        while (it.hasNext()){
            String s = it.next();                //ConcurrentModificationException
            if (s.equals("world")){
                list.add("oh");
            }
        }
​
        System.out.println(list);
    }
}
  • ConcurrentModificationException:当不允许这样的修改时,可以通过检测到对象的并发修改的方法来抛出此异常。

  • 在迭代器迭代对象的时候,不允许修改集合中的元素个数,造成了迭代器获取元素中判断预期修改值和实际修改值不一致(分析源码)

解决方案

  • 用for循环遍历即可

for (int i = 0; i < list.size(); i++) {
    String s = list.get(i);
    if (s.equals("world")){
        list.add("oh");
    }
}
  • 方案二:ListIterator列表迭代器进行add

ListIterator:列表迭代器

  • 通过List集合的listIterator()方法得到,他是List集合中特有的迭代器

public interface ListIterator<E>
extends Iterator<E>
  • 用于允许程序员沿任一方向遍历列表的列表的迭代器,在迭代期间*修改列表,并获取列表中迭代器的当前位置(与Iterator对比的不同之处)

  • 常用方法
voidadd(E e) 将指定的元素插入列表(可选操作)。
booleanhasNext() 返回 true如果遍历正向列表,列表迭代器有多个元素。
booleanhasPrevious() 返回 true如果遍历反向列表,列表迭代器有多个元素。
Enext() 返回列表中的下一个元素,并且前进光标位置。
intnextIndex() 返回随后调用 next()返回的元素的索引。
Eprevious() 返回列表中的上一个元素,并向后移动光标位置。
intpreviousIndex() 返回由后续调用 previous()返回的元素的索引。
voidremove() 从列表中删除由 next()previous()返回的最后一个元素(可选操作)。
voidset(E e)指定的元素替换由 next()previous()返回的最后一个元素(可选操作)。

使用

Iterator<String> it = list.listIterator();
​
ListIterator<String> lit = list.listIterator();
//正向遍历
while (lit.hasNext()){
    String s = lit.next();
    System.out.println(s);
}
​
//逆向遍历,很少用
while (lit.hasPrevious()){
    String s = lit.previous();
    System.out.println(s);
}
​
//重点掌握,add方法
while (lit.hasNext()){
            String s = lit.next();
            if (s.equals("java")){
                lit.add("oh");     //[hello, java, oh, world]  没有异常
            }
}
  • 使用add在迭代器中添加元素时不会抛出ConcurrentModificationException

增强for循环

作用:简化数组 和Colleciton集合的遍历

  • 使用范围:实现Iterator接口的类的对象

  • JDK 5 之后出现,内部原理是一个Iterator迭代器

格式

int[] arr = {3,2,1,56,77,9}
for(int i ; arr){
    System.out.println(i);
}
for(String s : list ) {
    if (s.equals("hello")){ 
        list.add("oh");          //ConcurrentModificationException,抛出该异常说明内部为迭代器
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值