您的位置:首页 > 其它

List删除元素

2018-11-27 15:19 113 查看

List删除元素

在单线程环境下的解决办法

public void remove() {
if (lastRet == -1)
throw new IllegalStateException();
checkForComodification();

try {
AbstractList.this.remove(lastRet);
if (lastRet < cursor)
cursor--;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}

 在这个方法中,删除元素实际上调用的就是list.remove()方法,但是它多了一个操作:

expectedModCount = modCount;

因此,在迭代器中如果要删除元素的话,需要调用Itr类的remove方法。

  将上述代码改为下面这样就不会报错了:

public class Test {
public static void main(String[] args)  {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(2);
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
Integer integer = iterator.next();
if(integer==2)
iterator.remove();   //注意这个地方
}
}
}

在多线程环境下的解决方法

List<String> myList = new CopyOnWriteArrayList<String>();
myList.add( "1");
myList.add( "2");
myList.add( "3");
myList.add( "4");
myList.add( "5");

new Thread(new Runnable() {

@Override
public void run() {
for (String string : myList) {
System.out.println("遍历集合 value = " + string);

try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();

new Thread(new Runnable() {

@Override
public void run() {

for (int i = 0; i < myList.size(); i++) {
String value = myList.get(i);

System.out.println("删除元素 value = " + value);

if (value.equals( "3")) {
myList.remove(value);
i--; // 注意
}

try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();

---------------------
作者:love_world_
来源:CSDN
原文:https://blog.csdn.net/androiddevelop/article/details/21509345
版权声明:本文为博主原创文章,转载请附上博文链接!
posted @ 2018-11-27 15:19 wdmiye 阅读(...) 评论(...) 编辑 收藏
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: