黑马程序员技术交流社区

标题: 关于ArrayList的疑问 [打印本页]

作者: java陈辉    时间: 2013-12-12 21:55
标题: 关于ArrayList的疑问
本帖最后由 java陈辉 于 2013-12-14 18:10 编辑

下面这段代为什么在for循环里面加上一个i--之后,就能完全删除掉abc?不加i--,就删除不掉?求解释。
public class Test {

                 public static void main(String[] args) {
                ArrayList<String> al = new ArrayList<String>();
                al.add("abc1");
                al.add("abc");
                al.add("abc");
                al.add("abc");
               

              for(int i=0; i<al.size(); i++){
                        if("abc".equals(al.get(i))){
                                al.remove(i);
                                i--;         //这里为什么要加一个i--之后,能把abc完全删除掉
                        }
                }
                        
                System.out.println(al);

        }

}


作者: 郭涛    时间: 2013-12-12 22:02
因为在遍历的过程中:
1、 i=2时,发现有重复的元素,然后删除。
2、如果没有i--这一步,那么下一次循环就是i=3,但是索引3位置的abc就自动移到索引2的位置
3、那么就遍历不到新的索引2位置的abc,所以会多出来一个abc
作者: 風諾    时间: 2013-12-12 22:14
本帖最后由 風諾 于 2013-12-12 22:15 编辑

集合,和数组不一样,集合长度可变,数组固定
对于ArrayList集合,你可以删除一个元素以后:
1、打印集合长度看看集合长度是否有变化
2、删除0脚标元素后,立刻打印0脚标元素,看看是什么值
作者: 潘金锋    时间: 2013-12-12 22:17
List跟数组的区别是其长度(size)是可变的,当删除掉List中的一个元素时,其长度会减一。如果没有i--,那么循环执行第二遍时长度变成3,i变成1,到第三遍判断条件时长度已经减为2,而i也增为2,条件不成立,循环结束。总共删掉了两个“abc”,还剩一个。i--的情况自己推理一下吧。不明白的时候用debug watch变量的变化会有帮助。
作者: 小斥候    时间: 2013-12-12 22:40
本帖最后由 小斥候 于 2013-12-12 22:43 编辑

al.size()是动态变化的,第一个元素被remove后size就减了1了,就是说,原来的第二个元素放到了第一个位置上。(形象一点就是:宝石消除游戏,下面的宝石被消除后,上面的就自动落下来了)
最好是从后往前remove-------for(int i=al.size();i>=0;i--)
作者: Kyle    时间: 2013-12-12 22:45
这里涉及到ArrayList集合中remove方法的知识点。
简单说就是:
当调用remove方法删除集合内的元素的时候,
是把这个元素从整个列表中删除,然后这个元素之后的所有元素往前移一位,即删除的元素之后所有的元素角标都-1.
那么如果循环当中计数器i不-1的话就相当于是跳过了一个元素,跳过的元素的角标就是原先删除元素的角标。
这么说能理解吗?
作者: icyyaww    时间: 2013-12-12 23:20
假设你有四个兜,每个兜里面有一个鸡蛋。你把第二个鸡蛋拿出来煮熟然后吃掉。后面的鸡蛋会依次往前面的兜里跳。也就是第三个鸡蛋进入第二个兜。第四个鸡蛋会进入第三个兜里。
这个时候第二个兜里还是有鸡蛋所以得从新检查。所以你得回头(i--)从新检查第二个兜。
作者: 田富丰    时间: 2013-12-13 10:24
其实楼主可能就是没有考虑到list集合会随着remove的删除,size减少,所有元素脚标-1,这样你再考虑为什么!我想应该会明白点吧!
作者: ISAI    时间: 2013-12-14 13:17
首先你要知道list和数组的区别。数组里面的元素减少不会造成数组长度的减少。而集合就会。知道这个后,就很容易知道为什么要i--了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2