关于 Java foreach 循环删除多个元素的有趣问题(不是抛异常哦)

2018-06-22 22:19:30 +08:00
 shazh520

先看代码:

        import java.util.ArrayList;
	import java.util.List;

	public class ForeachTest {
		public static void main(String[] args) {
			List<Integer> test = new ArrayList<>();
			for (int i = 0; i < 100; i++) {
				test.add(i);
			}
			System.out.println(test);

			for (int i = 0; i < 50; i++) {
				for (int t :
						test) {
					System.out.println(t);
					test.remove(t);
					break;
				}
			}

			System.out.println(test);
		}
	}

完整的代码在上面,各位大佬知道为什么会出现那种运行结果吗?如果知道请指点一二,推荐个阅读资料也行,不胜感激。我 Google 了一晚上只找到了一些关于异常的资料,反编译了以后代码是这样的

	import java.io.PrintStream;
	import java.util.ArrayList;
	import java.util.Iterator;
	import java.util.List;

	public class ForeachTest
	{
		public static void main(String[] paramArrayOfString)
		{
			ArrayList localArrayList = new ArrayList();
			for (int i = 0; i < 100; i++) {
				localArrayList.add(Integer.valueOf(i));
			}
			System.out.println(localArrayList);
			for (i = 0; i < 50; i++)
			{
				Iterator localIterator = localArrayList.iterator();
				if (localIterator.hasNext())
				{
					int j = ((Integer)localIterator.next()).intValue();
					System.out.println(j);
					localArrayList.remove(j);
				}
			}
			System.out.println(localArrayList);
		}
	}

我也看不出端倪啊。 我搞明白了会更贴的。

3507 次点击
所在节点    Java
25 条回复
shazh520
2018-06-22 22:54:52 +08:00
@qusthuang
@zpxshl 大佬,我结合你们两个的回答我找到答案了 哈哈 谢谢谢谢
lhx2008
2018-06-22 22:55:26 +08:00
@shazh520 你的代码可以简写成
50 次循环
renove(test[0])
第一次 test[0] 是 0
后面都是 1
VoidChen
2018-06-23 10:52:46 +08:00
@shazh520 其实 @lhx2008 早就说出了答案了,你还一直没看懂。。。
shazh520
2018-06-24 12:48:21 +08:00
@VoidChen 对的 哈哈
shazh520
2018-06-24 12:50:45 +08:00
如果代码是这样结果就完全不一样了,就像是 @qusthuang 说的那样,删除对象和下标的问题。
package com.sunhao.seckill;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SeckillApplicationTests {

public static void main(String[] args) {
List<Integer> integerList = new ArrayList<>();

for (int i = 0; i < 100; i++) {
integerList.add(i);
}

System.out.println(integerList);

for (int i = 0; i < 50; i++) {
for (Integer integer :
integerList) {
System.out.println(integer);
integerList.remove(integer);
break;
}
}

System.out.println(integerList);
}

}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/465153

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX