首页 / JAVA / 每个循环工作的Java
每个循环工作的Java
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了每个循环工作的Java,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3336字,纯文字阅读大概需要5分钟。
内容图文
![每个循环工作的Java](/upload/InfoBanner/zyjiaocheng/744/6fff01f6b3f44df5833c3e86e435e5dd.jpg)
我正在处理某项任务,当我偶然做错了但是代码执行并提供了正确的结果.我有点惊讶,并且记住了每个循环的所有这些是如何工作的.
示例(示例程序),
public static void main( String[] args )
{
String myInput = "hello , hi , how are you ";
String[] splitted = myInput.split(",");
List<String> mylist = new ArrayList<String>();
for (String output : splitted)
{
mylist.add(output);
}
for (String output : mylist)
{
System.out.println(output);
mylist = new ArrayList<String>(); //It worked
mylist.add(output);
}
for (String output : splitted)
{
mylist.add(output);
}
for (String output : mylist)
{
System.out.println(output);
mylist.add(output); // After this line it threw exception java.util.ConcurrentModificationException
}
}
我很想知道,在搜索的过程中,我发现另外一篇文章说如果我们使用迭代器方法我们可以从列表中删除元素,所以我试过,
for (String output : splitted)
{
mylist.add(output);
}
for (Iterator iterator2 = mylist.iterator(); iterator2.hasNext();)
{
String string = (String) iterator2.next();
System.out.println(string);
iterator2.remove(); //It worked but if I used the same thing to remove element from original list it threw exception.
}
现在我只想知道上面引用的每个循环背后发生了什么.
我想知道技术方??面,我知道我无法修改每个循环的集合,但在某些情况下,上面说明了它的工作原理?
解决方法:
Now I just want to know what is happening behind the every for each
loop quoted above
1. for (String output : splitted)
{
mylist.add(output);
}
这会将分割数组中的每个输出字符串添加到mylist列表中.
2. for (String output : mylist)
{
System.out.println(output);
mylist = new ArrayList<String>(); //It worked
mylist.add(output);
}
for语句由以下产品管理:
for ( FormalParameter : Expression )
Statement
其中Expression必须是java.lang.Iterable或数组的实例.所以这个:每个循环都等同于:
Iterator<String> iterator = mylist.iterator();
while (iterator.hasNext()) {
System.out.println(output);
mylist = new ArrayList<String>(); //It worked
mylist.add(output);
}
这里mylist.iterator()将返回Iterator类型的新实例:
public Iterator<E> iterator() {
return new Itr();
}
因此,即使您正在创建新的ArrayList实例并在每次迭代时将它们分配给mylist,从原始mylist获取的迭代器仍将具有对原始mylist的引用,并将继续迭代原始mylist的元素.迭代器保持对其创建的列表的引用.赋值mylist = new ArrayList< String>()对迭代器处理的数据没有影响,因为它更改了变量mylist而不是列表本身.
3. for (String output : mylist)
{
System.out.println(output);
mylist.add(output); // After this line it threw exception java.util.ConcurrentModificationException
}
以下语句解释了这种行为.它是从Arraylist doc复制的:
The iterators returned by this class’s iterator and listIterator methods are fail-fast: if the list is structurally modified at any time after the iterator is created, in any way except through the iterator’s own remove or add methods, the iterator will throw a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future.
4. for (Iterator iterator2 = mylist.iterator(); iterator2.hasNext();)
{
String string = (String) iterator2.next();
System.out.println(string);
iterator2.remove(); //It worked but if I used the same thing to remove element from original list it threw exception.
}
上面的语句还解释了这个for循环的行为:迭代遍历列表时,迭代器自己的remove或add方法可以在结构上修改列表.
内容总结
以上是互联网集市为您收集整理的每个循环工作的Java全部内容,希望文章能够帮你解决每个循环工作的Java所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。