黑马程序员技术交流社区
标题:
关于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