参考:http://blog.csdn.net/androidboy365/article/details/50540202/
解决方案
// 1 使用Iterator提供的remove方法,用于删除当前元素 for(Iterator<string> it = myList.iterator(); it.hasNext();) { String value = it.next(); if(value.equals("3")) { it.remove(); // ok } } System. out.println( "List Value:" + myList.toString()); // 2 建一个集合,记录需要删除的元素,之后统一删除 List<string> templist = newArrayList<string>(); for(String value : myList) { if(value.equals("3")) { templist.remove(value); } } // 可以查看removeAll源码,其中使用Iterator进行遍历 myList.removeAll(templist); System. out.println( "List Value:" + myList.toString()); // 3. 使用线程安全CopyOnWriteArrayList进行删除操作 List<string> myList = newCopyOnWriteArrayList<string>(); myList.add("1"); myList.add("2"); myList.add("3"); myList.add("4"); myList.add("5"); Iterator<string> it = myList.iterator(); while(it.hasNext()) { String value = it.next(); if(value.equals("3")) { myList.remove("4"); myList.add("6"); myList.add("7"); } } System. out.println( "List Value:" + myList.toString()); // 4. 不使用Iterator进行遍历,需要注意的是自己保证索引正常 for(inti = 0; i < myList.size(); i++) { String value = myList.get(i); System. out.println( "List Value:" + value); if(value.equals("3")) { myList.remove(value); // ok i--;// 因为位置发生改变,所以必须修改i的位置 } } System. out.println( "List Value:" + myList.toString());
单线程情况下列出4种解决方案,但是在多线程情况下仅有第4种方案才能在多线程情况下不出现问题。
List<string> myList = newCopyOnWriteArrayList<string>(); myList.add("1"); myList.add("2"); myList.add("3"); myList.add("4"); myList.add("5"); newThread(newRunnable() { @Override publicvoidrun() { for(String string : myList) { System.out.println("遍历集合 value = " + string); try{ Thread.sleep(100); }catch(InterruptedException e) { e.printStackTrace(); } } } }).start(); newThread(newRunnable() { @Override publicvoidrun() { for(inti = 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();