在我们用ArrayList<E>类调用add或者remove方法后,特别要注意:此时ArrayList的对象的列表的元素个数以及指定索引位置的元素值已经发生了变化。
下面我们举代码进行详细说明。
调用remove方法后发生的的变化
package personal.hushunfeng;
/**
* @author hushunfeng
*/
import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
//生成一个测试ArrayList
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("hu");
arrayList.add("shun");
arrayList.add("feng");
//原列表元素个数
System.out.println("原列表元素个数:"+arrayList.size());
//原列表索引值为1的元素内容
System.out.println("原列表索引值为1的元素内容:"+arrayList.get(1));
//原列表索引值为2的元素内容
System.out.println("原列表索引值为1的元素内容:"+arrayList.get(2));
//对原列表调用remove方法
arrayList.remove(1);
//新列表引值为1的元素内容
System.out.println("原列表索引值为1的元素内容:"+arrayList.get(1));
//新列表索引值为2的元素内容
System.out.println("原列表索引值为1的元素内容:"+arrayList.get(2));
}
}
运行后的结果:
结果分析:调用remove方法后,arrayList的元素个数为2,原来第3个元素已经自动移成第2个元素。这一点在使用时特别要注意。
根据这一点,我们编写一段代码,需要实现的功能:删除某个字符串ArrayList中的每一个长度为奇数的字符串。
错误代码如下。
package personal.hushunfeng;
/**
* @author hushunfeng
*/
import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
//生成一个测试ArrayList
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("hu");
arrayList.add("shun");
arrayList.add("feng");
for(int i=0;i<arrayList.size();i++) {
if(arrayList.get(i).length()%2!=0) {
arrayList.remove(i);
}
}
//查看结果
System.out.println(arrayList);
}
}
运行后的结果:[shun]
显然这断代码不能实现我们预期的要求。这都是在调用remove方法后,arrayList的size和索引位置元素发生导致的结果。
错误分析如下。
- i=0;size=3,执行remove,删除hu
- i=1;size=2,执行remove,删除feng
- i=2;size=1,不执行remove操作
下面我们将上述代码进行修改。
package personal.hushunfeng;
/**
* @author hushunfeng
*/
import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
//生成一个测试ArrayList
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("hu");
arrayList.add("shun");
arrayList.add("feng");
arrayList.add("feng1");
arrayList.add("feng12");
for(int i=0;i<arrayList.size();i++) {
if(arrayList.get(i).length()%2!=0) {
arrayList.remove(i);
i-- ;
}
}
//查看结果
System.out.println(arrayList);
}
}
运行后的结果:[hu, shun, feng, feng12]
符合要求,if语句里的i--起到了本质效果,但这样写很不规范。
下面参考书上的写法。
package personal.hushunfeng;
/**
* @author hushunfeng
*/
import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
//生成一个测试ArrayList
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("hu");
arrayList.add("shun");
arrayList.add("feng");
arrayList.add("feng1");
arrayList.add("feng12");
int i = 0;
while(i<arrayList.size()) {
String element = arrayList.get(i);
if(element.length()%2!=0) {
//如果能够删除成功,则原先后面一个元素
//代替它,继续判断这个位置上的元素符不符合要求
arrayList.remove(i);
}
else {
//如果删除不成功,则调到下一个元素
i++;
}
}
//查看结果
System.out.println(arrayList);
}
}
总结:1.注意列表的使用 2.比较下for循环和while循环的在特殊的场合哪个更适用。