今天有一个同学给我一段代码,说ArrayList出错了,叫我看看哪出错了。
在说代码之前,我想说一句:编程过程中,任何问题都是程序员自己的问题。
程序是不会偷懒的,也不会失误的,出现了问题只能是自己的问题。
下面是学生给我代码:
public class ObRef {
public static void main(String[] args){
ArrayList list=new ArrayList();
list.add("java");
list.add("aaa");
list.add("java");
list.add("java");
list.add("bbb");
//得到的结果是[aaa, bbb] 将重复的java都删除了
for(int i=list.size()-1;i>=0;i--){
if("java".equals(list.get(i))){
list.remove(i);
}
}
System.out.println(list);
//得到的结果是[aaa, java, bbb] 不能将重复的java都删除了
for(int i=0;i<list.size();i++){
if("java".equals(list.get(i))){
list.remove(i);
}
}
System.out.println(list);
}
}
一看两个for()循环效果是一样的,事实上效果确实是一样的,都是把ArrayList遍历一次,
但重点是这个程序执行的是remove()操作,第一个for()循环没有问题,从集合的尾端一个
一个的把"java"删除掉。
但第二个for()循环为什么会少删除掉一个"java"呢.remove(int index)方法是移除此列表中指定位置上的元素。
那我们可以想一下,把list(i)位置上的元素删除后,list(i)==null? 答案是否定的,List会把list(i+1)填补上去。
第二个for()循环在执行remove(2)删除第二个"java"后,list的元素从第4个元素开始全部上移了一位,所以
list(3)由“java”变为了“bbb”。“bbb”.equals("java")返回false,就导致了少删掉了一个"java".
其实道理很简单,要是被大牛看到了就真的是献丑了。
但我真的想表达的是作为一个程序员,
第一要不怕出错,作为新手肯定会遇到很多问题,那问题出现之后想到的
应该是尽快的去解决问题,多解决一个问题自己的知识死角就少一个。
第二一定要有严谨的心,还是那句话,计算机不会骗你。看问题要看全面
同样是for()遍历了集合,但从开始和从尾开始执行remove()方法就会有
不同的效果,也提醒了我们想问题要从全面着想,不要咬住一点不放,在
这方面不要钻牛角尖。
以上都是我的一点小小的心得,希望对刚入行的朋友有一点帮助吧。