java的一个容器陷阱

今天有一个同学给我一段代码,说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()方法就会有

不同的效果,也提醒了我们想问题要从全面着想,不要咬住一点不放,在

这方面不要钻牛角尖。

以上都是我的一点小小的心得,希望对刚入行的朋友有一点帮助吧。

 

转载于:https://www.cnblogs.com/gaoqianggg/archive/2012/07/09/2583867.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值