代码: package csdn_629;import java.util.ArrayList;public class TextList { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); list.add("java"); list.add("aaa"); list.add("java"); list.add("java"); list.add("bbb"); System.out.println(list);
for(int i=0; i<list.size(); i++){ if(list.get(i).equals("java")){ String s = list.remove(i); System.out.println(s); s = list.get(i); System.out.println(i); i = 0;//加上这句话! } } System.out.println(list); }}
remove的时候size变小了,但是i还是递增
你这题在于理解remove()方法出错了。你先看下remove()方法的源码: public E remove(int index) { rangeCheck(index); modCount++; E oldValue = elementData(index); int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work return oldValue; }remove()方法执行后,它的数组下标是会变化的,比如你删除下标为0的元素,那么原先下边为1的元素会变成下标为0。就跟排队一样,后面的要往前面挤。而你是for循环中,i是不断加1的。所以才会出现这样的错误。
public class TestList { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); list.add("java"); list.add("aaa"); list.add("java"); list.add("java"); list.add("bbb"); System.out.println(list);
for(int i = list.size()-1; i >= 0; i--)
package csdn_629;import java.util.ArrayList;public class TextList {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("java");
list.add("aaa");
list.add("java");
list.add("java");
list.add("bbb");
System.out.println(list);
for(int i=0; i<list.size(); i++){
if(list.get(i).equals("java")){
String s = list.remove(i);
System.out.println(s);
s = list.get(i);
System.out.println(i);
i = 0;//加上这句话!
}
}
System.out.println(list);
}}
public E remove(int index) {
rangeCheck(index); modCount++;
E oldValue = elementData(index); int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work return oldValue;
}remove()方法执行后,它的数组下标是会变化的,比如你删除下标为0的元素,那么原先下边为1的元素会变成下标为0。就跟排队一样,后面的要往前面挤。而你是for循环中,i是不断加1的。所以才会出现这样的错误。
import java.util.Iterator;
public class TestList {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("java");
list.add("aaa");
list.add("java");
list.add("java");
list.add("bbb");
System.out.println(list);
for(Iterator<String> itor = list.iterator(); itor.hasNext();){
String s = itor.next();
if("java".equals(s)) itor.remove();
}
System.out.println(list);
}
}>javac -encoding UTF-8 TestList.java
>Exit code: 0 Time: 2.118
>java -cp . TestList
[java, aaa, java, java, bbb]
[aaa, bbb]
>Exit code: 0 Time: 5.336
if("java".equals(list.get(i))){
list.remove(i);
// System.out.println(list.size());
// //System.out.println(list);
// // s=list.get(i);
// //System.out.println(i);
}
两种方式处理:
1、弄两个开始一样的list,一个用于判断,一个用于remove,最后remove之后的那个就符合要求。
2、用if语句进行判断,处理i的值。