List

2020-04-14  本文已影响0人  甜甜圈李

并发修改异常产生的原因及解决方案

需求:我有一个集合,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。

List list = new ArrayList();

list.add("a");

list.add("b");

list.add("world");

list.add("d");

list.add("e");

Iterator it = list.iterator();

while(it.hasNext()) {

String str = (String)it.next();

if(str.equals("world")) {

list.add("javaee"); //这里会抛出ConcurrentModificationException并发修改异常

}

}

ConcurrentModificationException出现

迭代器遍历,集合修改集合

解决方案

a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)

b:集合遍历元素,集合修改元素

ListIterator lit = list.listIterator(); //如果想在遍历的过程中添加元素,可以用ListIterator中的add方法

while(lit.hasNext()) {

String str = (String)lit.next();

if(str.equals("world")) {

lit.add("javaee");

//list.add("javaee");

}}

List的三个子类的特点

ArrayList:

底层数据结构是数组,查询快,增删慢。

线程不安全,效率高。

Vector:

底层数据结构是数组,查询快,增删慢。

线程安全,效率低。

Vector相对ArrayList查询慢(线程安全的)

Vector相对LinkedList增删慢(数组结构)

LinkedList:

底层数据结构是链表,查询慢,增删快。

线程不安全,效率高。

Vector和ArrayList的区别

Vector是线程安全的,效率低

ArrayList是线程不安全的,效率高

ArrayList和LinkedList的区别

ArrayList底层是数组结果,查询和修改快

LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢

我们到底使用谁呢?

查询多用ArrayList

增删多用LinkedList

如果都多ArrayList

上一篇下一篇

猜你喜欢

热点阅读