`
hjj20040849
  • 浏览: 115347 次
  • 来自: 广州
社区版块
存档分类
最新评论

使用for循环删除集合元素需要注意的问题

    博客分类:
  • java
阅读更多

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
分享到:
评论

相关推荐

    java for循环与增强for循环

    普通for循环的优点是它可以对数组或集合进行任意的操作,例如删除、添加元素等。但是,普通for循环的缺点是代码变得复杂,且不易阅读。 结论 增强for循环是一种非常有用的循环方式,尤其是在遍历集合时。它可以...

    Java中增强for循环的实现原理和坑详解

    在使用增强for循环时,需要注意以下几点: * 增强for循环只能用于遍历集合或数组,不可以用于遍历普通对象。 * 在遍历过程中,不能修改集合或数组的内容,以免引发ConcurrentModificationException异常。 * 使用...

    java基础for循环练习题

    如果需要对集合进行更复杂的操作,比如删除元素,则可能需要使用基本的`for`循环配合迭代器。 5. **其他用法** `for`循环还可以用于迭代特定次数,比如在图形绘制、计数器或循环等待时。此外,嵌套`for`循环是处理...

    java中for循环删除集合陷阱

    总结起来,Java中使用for循环删除集合元素时需谨慎,避免在循环内部直接修改集合。如果必须在循环中进行增删改操作,可以考虑使用迭代器或者`Iterator.remove()`方法,这能更安全地处理集合的动态变化。同时,理解...

    C#遍历List并删除某个元素的方法

    通常,开发者可能会本能地使用for循环来遍历List,如下所示: ```csharp for (int i = 0; i ; i++) { if (list[i]) { list.RemoveAt(i); } } ``` 这种方法的问题在于,当你删除了一个元素后,所有后续元素的...

    在list集合中输入元素,去除重复的元素并输出

    根据给定文件的信息,本文将详细介绍如何在Java的List集合中去除重复元素的三种方法:使用for循环、使用迭代器以及利用HashSet的特性。 ### 一、使用for循环去除重复元素 这种方法的基本思想是通过双重循环来遍历...

    java集合类arraylist循环中删除特定元素的方法.docx

    - 直接在循环中删除`ArrayList`元素时,需要特别注意索引变化,避免出现越界异常。 - 使用`Iterator`删除元素是一种更安全、更推荐的做法,因为它自动处理了删除后的索引调整问题。 - 在实际开发中,建议优先考虑...

    C#在foreach遍历删除集合中元素的三种实现方法

    在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。 集合已修改;可能无法执行枚举操作。 方法一:采用for循环,并且从尾到头遍历 如果...

    增强for循环

    需要注意的是,增强型for循环不能用于修改迭代的目标集合,因为它使用的是迭代器的内部实现,不暴露迭代器的`remove()`方法。如果需要在循环中删除元素,仍然需要使用传统的迭代器方式。此外,增强型for循环也无法...

    遍历并批量删除容器中元素出现ConcurrentModificationException原因及处置

    - 当你使用`for-each`循环(增强for循环)遍历集合时,实际上底层是通过迭代器实现的。但是,如果你在循环内部直接修改集合(比如删除元素),而不是通过迭代器的`remove()`方法,那么迭代器将无法跟踪这些变化,...

    java中关于集合的操作

    - 常规遍历:使用`for-each`循环,如`for (Element e : collection)`. - 迭代器遍历:`Iterator it = collection.iterator(); while (it.hasNext()) { it.next(); }` - Java 8的流API遍历:`collection.stream()....

    老生常谈foreach(增强for循环)和for的区别

    老生常谈foreach(增强for循环)和for的区别 在 Java 编程语言中,foreach 和 for 是两种常用的循环语句,都是用于遍历数组或集合的元素。然而,foreach 和 for 之间存在一些关键的区别,了解这些区别对于编写高效的...

    实现Java删除一个集合的多个元素

    总之,Java中删除集合元素时应避免在`for each`循环中直接调用集合的`remove()`方法,而是应该使用`Iterator`或`Stream API`来保证操作的安全性。同时,理解`ConcurrentModificationException`的产生原因和如何避免...

    java 使用foreach遍历集合元素的实例

    在本实例中,我们将深入探讨如何使用`foreach`循环遍历集合元素,并理解其工作原理以及可能遇到的问题。 首先,让我们看下给出的代码示例: ```java import java.util.*; public class ForeachTest { public ...

    java中循环删除list中元素的方法总结

    - **单个元素删除**:无论是常规for循环、增强for循环还是Iterator遍历,都可以用来删除列表中的特定单个元素,但需要注意每种方法的潜在问题,如索引错位或并发修改异常。 - **多元素删除**:在需要循环删除多个...

    集合框架的使用方法

    4. 遍历:迭代器(Iterator)是遍历集合的主要方式,也可使用增强for循环(foreach)。 四、源码分析 深入理解集合框架的源码可以帮助我们优化性能,例如: - ArrayList的扩容机制:当元素数量超过数组容量时,会...

    [] - 2023-03-10 切记,任何时候都不要在 for 循环中删除 List 集合元素!!!.pdf

    互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...

    js与jquery获取父元素,删除子元素的两种不同方法.docx

    当需要遍历一系列DOM元素时,可以使用普通的`for`循环: ```javascript var elements = document.getElementsByClassName("className"); for (var i = 0; i ; i++) { var element = elements[i]; // 对element...

    java新特性之for循环最全的用法总结

    例如,如果你需要在遍历过程中修改集合元素,或者在迭代过程中删除元素,那么应当使用传统的for循环或者显式迭代器。例如: ```java List&lt;String&gt; names = new ArrayList(); // 使用传统的for循环实现删除元素 ...

Global site tag (gtag.js) - Google Analytics