自定義一個ArrayList然后把符合條件的元素刪除。
第一種方法:順序循環,減一操作,把符合條件的元素刪除;如果不進行減一操作,當list把符合條件的元素刪除后,后面符合的元素可能不會刪除,導致程序出錯。
import java.util.ArrayList; import java.util.List; public class ListTest { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("Tom"); list.add("Tom"); list.add("David"); list.add("Lily"); list.add("Lucy"); list.add("James"); for (int i = 0; i < list.size(); i++) { if ("Tom".equals(list.get(i))) { list.remove(i); // 減一操作 i--; } } System.out.println(list.toString()); } }
結果如下:
錯誤代碼:

import java.util.ArrayList; import java.util.List; public class ListTest { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("Tom"); list.add("Tom"); list.add("David"); list.add("Lily"); list.add("Lucy"); list.add("James"); for (int i = 0; i < list.size(); i++) { if ("Tom".equals(list.get(i))) { list.remove(i); } } System.out.println(list.toString()); } }
結果如下:
為什么會出現這種情況呢?原來List每remove掉一個元素以后,后面的元素都會向前移動,此時如果執行i=i+1,則剛剛移過來的元素沒有被讀取。
第二種方法:倒序循環,把符合條件的元素直接刪除。
import java.util.ArrayList; import java.util.List; public class ListTest { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("Tom"); list.add("Tom"); list.add("David"); list.add("Lily"); list.add("Lucy"); list.add("James"); for (int i = list.size() - 1; i >= 0; i--) { if ("Tom".equals(list.get(i))) { list.remove(i); } } System.out.println(list.toString()); } }
結果如下:
第三種方法:使用迭代器,把符合條件的元素刪除。
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ListTest { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("Tom"); list.add("Tom"); list.add("David"); list.add("Lily"); list.add("Lucy"); list.add("James"); Iterator<String> it = list.iterator(); while (it.hasNext()) { if ("Tom".equals(it.next())) { it.remove(); } } System.out.println(list.toString()); } }
結果如下:
推薦使用第三種方法進行remove操作。