ArrayList 的删除的小问题,在线等
ArrayList的初始化内容如下:
ArrayList list = new ArrayList();
list.add("java");
list.add("aaa");
list.add("java");
list.add("java");
list.add("bbb");
下面可以删除list中所有的“java”的代码是:
A.for (int i = list.size() - 1; i >= 0; i--) {
if ("java".equals(list.get(i))) {
list.remove(i);
}
}
B.for (int i = 0; i < list.size(); i++) {
if ("java".equals(list.get(i))) {
list.remove(i);
}
}
请问,为什么只有A可行,B为什么不行呢 thanks
[解决办法]
B 当你第一次移除的时候是1个 也就是list.remove(0),当循环进行到 i=3时 你之前 已经移除了 0 1 2,也就是移除了三个,而你的集合里面总共才五个值 移除了三个了 最后只剩下两个了,当你再去移除list.remove(3)时,而3根本不存在了,会出现数组越界异常的。
[解决办法]
B : list.remove(i);后面加上i--
[解决办法]
B,当然不行,比如B中,起始的时候 for循环中 i < 5 , 删除掉一个,那么list.size() = 4,那么 此时
list.get(3)才是list的最后一个元素 ,而for循环中 i会一直循环到 4,此时 list.get(4),报 list越界啦
[解决办法]
两种写法都是错误的 会数组越界,
A.for (int i = list.size() - 1; i >= 0; i--) {
if ("java".equals(list.get(i))) {
list.remove(i);
i= i+1 ;
}
}
B.for (int i = 0; i < list.size(); i++) {
if ("java".equals(list.get(i))) {
list.remove(i);
i= i-1 ;
}
}
[解决办法]
A.for (int i = list.size() - 1; i >= 0; i--) { if ("java".equals(list.get(i))) { list.remove(i); } }B.for (int i = 0; i < list.size(); i++) { if ("java".equals(list.get(i))) { list.remove(i);i--; } }C.for(Iterator it = list.iterator();it.hasNext;){ if ("java".equals(it.next) { it.remove(); }}
[解决办法]
主要原因在于,ArrayList.size()这个方法得到是集合中的元素个数,而不像数组中的length属性中得到的是数组的长度,前者是随着集合内的元素增删而改变的,后而后者是不变得。这两个概念不要混淆。
下面说一下你的困惑:
为什么B不行的,看一下B的代码:分析一下;for (int i = 0; i < list.size(); i++) 这句代码中,中间这句,就是循环的判断条件,i<List.size();根据上面的原理,这个i值是变化的。根据程序走一遍。
1.for循环刚开始,i初始化等于0;而这是的集合中有六个元素,所以list.size()等于6,符合条件,执行了循环体。接着i++
2.进过上面的i++,这i等于1了,而这是list.size()因为删除了一个元素,所以等于5个,也符合i< list.size()这个条件,所以又执行的循环体,i再次++;
。
。
3.当i自增到4的时候,因为经过循环体的四次循环后,集合中只剩下了2个元素(java,bbb),list.size()等于2而小于i,因为程序的循环条件不成立而退出的循环,但是这时候集合中还有一个java还没有删除。故这种方法不可行,A为什么可以,你自己按照这个理论推一下。
[解决办法]
for (int i = list.indexOf("java"); i>=0; i = list.indexOf("java")) {list.remove(i);}