for语句在程序开发中经常被用到,他语法简单逻辑严谨,在一定的情况下可以节省很多用while和dowhile代码量,所以他的应用范围是很广泛的,但是,在应用的时候,如果语句中的自增或者自减变量i若处理不当,就可能给程序带来巨大隐患。例如在用for语句删除集合中的元素时,就可能出现以下的情况。
下面先给个例子大家看一下先。
public class e {
public static void main(String[] args) {
List<String> tempList = new LinkedList<String>();
tempList.add("A");
tempList.add("B");
tempList.add("C");
for(int i = 0; i < tempList.size(); i++){
tempList.remove(i);
}
if(tempList.size() > 0){
System.out.println("剩余的个数为:" + tempList.size() + ",具体的元素为:");
for(String t : tempList){
System.out.println(t);
}
} else{
System.out.println("所有的元素已经删除完毕");
}
}
}
不知道大家看到问题了没有,或许很多朋友会说,没问题啊。。好吧,下面我们看一下程序的运行结果。
结果竟然出乎我们的意料,竟然还有个B,对吧,为什么呢? 下面就让我们来一起探讨一下吧。
说道这里,首先我们就要先了解一下集合元素删除的内部变化吧,就这个案例来说,
如图,我们分析得到,每当删除一个元素时,集合的size方法的值都会减小1,这将直接导致集合中元素的索引重新排序,进一步说,就是剩余所有元素的索引值都减1,正如上图所示,而for循环语句的局部变量i仍然在递增,这将导致删除操作发生跳跃。从而导致上述B么还有删除的问题。。
下面我们再更改一下程序。
import java.util.LinkedList;
import java.util.List;
public class test {
public static void main(String[] args) {
List<String> tempList = new LinkedList<String>();
tempList.add("A");
tempList.add("B");
tempList.add("C");
for(int i = 0; i < tempList.size(); i++){
tempList.remove(i);
i--;
}
if(tempList.size() > 0){
System.out.println("剩余的个数为:" + tempList.size() + ",具体的元素为:");
for(String t : tempList){
System.out.println(t);
}
} else{
System.out.println("所有的元素已经删除完毕");
}
}
}
看一下下面的结果, 正确了吧,呵呵。
写下这个的原因是希望大家也注意这些类似的情况,不一定是删除集合时才需要注意。细节不仅能够打败爱情,还能够打败成功,所以要小心哦。。
- 大小: 7.7 KB
- 大小: 3.8 KB
- 大小: 4.2 KB
分享到:
相关推荐
普通for循环的优点是它可以对数组或集合进行任意的操作,例如删除、添加元素等。但是,普通for循环的缺点是代码变得复杂,且不易阅读。 结论 增强for循环是一种非常有用的循环方式,尤其是在遍历集合时。它可以...
在使用增强for循环时,需要注意以下几点: * 增强for循环只能用于遍历集合或数组,不可以用于遍历普通对象。 * 在遍历过程中,不能修改集合或数组的内容,以免引发ConcurrentModificationException异常。 * 使用...
总结起来,Java中使用for循环删除集合元素时需谨慎,避免在循环内部直接修改集合。如果必须在循环中进行增删改操作,可以考虑使用迭代器或者`Iterator.remove()`方法,这能更安全地处理集合的动态变化。同时,理解...
通常,开发者可能会本能地使用for循环来遍历List,如下所示: ```csharp for (int i = 0; i ; i++) { if (list[i]) { list.RemoveAt(i); } } ``` 这种方法的问题在于,当你删除了一个元素后,所有后续元素的...
如果需要对集合进行更复杂的操作,比如删除元素,则可能需要使用基本的`for`循环配合迭代器。 5. **其他用法** `for`循环还可以用于迭代特定次数,比如在图形绘制、计数器或循环等待时。此外,嵌套`for`循环是处理...
根据给定文件的信息,本文将详细介绍如何在Java的List集合中去除重复元素的三种方法:使用for循环、使用迭代器以及利用HashSet的特性。 ### 一、使用for循环去除重复元素 这种方法的基本思想是通过双重循环来遍历...
- 直接在循环中删除`ArrayList`元素时,需要特别注意索引变化,避免出现越界异常。 - 使用`Iterator`删除元素是一种更安全、更推荐的做法,因为它自动处理了删除后的索引调整问题。 - 在实际开发中,建议优先考虑...
在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。 集合已修改;可能无法执行枚举操作。 方法一:采用for循环,并且从尾到头遍历 如果...
需要注意的是,增强型for循环不能用于修改迭代的目标集合,因为它使用的是迭代器的内部实现,不暴露迭代器的`remove()`方法。如果需要在循环中删除元素,仍然需要使用传统的迭代器方式。此外,增强型for循环也无法...
- 当你使用`for-each`循环(增强for循环)遍历集合时,实际上底层是通过迭代器实现的。但是,如果你在循环内部直接修改集合(比如删除元素),而不是通过迭代器的`remove()`方法,那么迭代器将无法跟踪这些变化,...
- 常规遍历:使用`for-each`循环,如`for (Element e : collection)`. - 迭代器遍历:`Iterator it = collection.iterator(); while (it.hasNext()) { it.next(); }` - Java 8的流API遍历:`collection.stream()....
老生常谈foreach(增强for循环)和for的区别 在 Java 编程语言中,foreach 和 for 是两种常用的循环语句,都是用于遍历数组或集合的元素。然而,foreach 和 for 之间存在一些关键的区别,了解这些区别对于编写高效的...
总之,Java中删除集合元素时应避免在`for each`循环中直接调用集合的`remove()`方法,而是应该使用`Iterator`或`Stream API`来保证操作的安全性。同时,理解`ConcurrentModificationException`的产生原因和如何避免...
在本实例中,我们将深入探讨如何使用`foreach`循环遍历集合元素,并理解其工作原理以及可能遇到的问题。 首先,让我们看下给出的代码示例: ```java import java.util.*; public class ForeachTest { public ...
- **单个元素删除**:无论是常规for循环、增强for循环还是Iterator遍历,都可以用来删除列表中的特定单个元素,但需要注意每种方法的潜在问题,如索引错位或并发修改异常。 - **多元素删除**:在需要循环删除多个...
4. 遍历:迭代器(Iterator)是遍历集合的主要方式,也可使用增强for循环(foreach)。 四、源码分析 深入理解集合框架的源码可以帮助我们优化性能,例如: - ArrayList的扩容机制:当元素数量超过数组容量时,会...
互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...
当需要遍历一系列DOM元素时,可以使用普通的`for`循环: ```javascript var elements = document.getElementsByClassName("className"); for (var i = 0; i ; i++) { var element = elements[i]; // 对element...
例如,如果你需要在遍历过程中修改集合元素,或者在迭代过程中删除元素,那么应当使用传统的for循环或者显式迭代器。例如: ```java List<String> names = new ArrayList(); // 使用传统的for循环实现删除元素 ...