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也应该i--
------解决方案--------------------
------解决方案--------------------A数组会越界,B不会,所以A可以B不行
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------啊啊啊啊 我太粗心了,,悲剧
第一种写法是正确的 ,其实看了这个题,以后又知道一种删除List元素不用去管越界问题的写法了,杂以前没想到呢,童鞋些有这种感觉吗
------解决方案--------------------list集合自动前移的问题:
list集合中删除前一元素,后边的元素会自动前移,即原来5个元素,删除后就只有0-4位置的元素了,这样肯定出现问题。所以删除元素从后到前。
------解决方案--------------------Java code