Java 循环浏览列表,更好的方法
当我在Java中编写代码并发现新的工作方法时,我总是对更好的通过列表循环输出数据的方法感到困惑 在下面的示例中,我循环遍历列表并使用计数器,因此很多次我不得不在输出中包含索引计数器 我偏爱方法1,但我发现这些方法中的任何一种都有点过时。我见过许多循环列表的例子,方法2是最常用的 所以我的问题是什么是更好的方法,如果所有这些方法都一样,那么什么是最标准的Java 循环浏览列表,更好的方法,java,loops,arraylist,Java,Loops,Arraylist,当我在Java中编写代码并发现新的工作方法时,我总是对更好的通过列表循环输出数据的方法感到困惑 在下面的示例中,我循环遍历列表并使用计数器,因此很多次我不得不在输出中包含索引计数器 我偏爱方法1,但我发现这些方法中的任何一种都有点过时。我见过许多循环列表的例子,方法2是最常用的 所以我的问题是什么是更好的方法,如果所有这些方法都一样,那么什么是最标准的 private ArrayList<String> list = new ArrayList<String>(); p
private ArrayList<String> list = new ArrayList<String>();
public Test() {
list.add("One");
list.add("Two");
list.add("Three");
list.add("Four");
list.add("Five");
method1();
method2();
method3();
}
public void method1() {
System.out.println("Method 1");
int i = 1;
for (String value:list) {
System.out.println((i++) + " = " + value);
}
}
public void method2() {
System.out.println("Method 2");
for (int i = 0; i < list.size(); i++) {
System.out.println((i+1) + " = " + list.get(i));
}
}
public void method3() {
System.out.println("Method 3");
Iterator<String> it = list.iterator();
int i = 1;
while (it.hasNext()) {
System.out.println((i++) + " = " + it.next());
}
}
private ArrayList list=new ArrayList();
公开考试(){
列表。添加(“一”);
列表。添加(“两个”);
列表。添加(“三”);
列表。添加(“四”);
列表。添加(“五”);
方法1();
方法2();
方法3();
}
公共无效方法1(){
系统输出打印项次(“方法1”);
int i=1;
for(字符串值:列表){
System.out.println((i++)+“=”+值);
}
}
公开作废方法2(){
系统输出打印项次(“方法2”);
对于(int i=0;i
method1()
类似于method3()
,因为for-each循环在后台使用列表的迭代器。method3()
的不同之处在于,您实际上可以访问此迭代器,因此,如果您希望从列表中删除元素,可以对其调用remove
另一方面,根据底层实现的不同,method2()
可能会导致“糟糕”的性能。如果您的列表是链接列表
,get
具有O(n)
复杂度时间,因此for循环将具有O(n^2)
复杂度。使用迭代器,您将始终以恒定时间获得下一个元素
我个人会使用1,它编写的代码也更少,这是for-each循环的主要优点之一,如果您的目的是在数据结构上执行只读操作的话
如果您使用的是Java 8,并且不需要打印索引,还可以执行以下操作:
list.forEach(System.out::println);
没有。使用java 8中提供的lambda表达式
或者,如果使用Java<8,则使用Guava函数。第一个更好,并且最不容易出错
public void method1() {
System.out.println("Method 1");
int i = 1;
for (String value:list) {
System.out.println((i++) + " = " + value);
}
}
第二个选项与您正在使用的集合紧密耦合。这意味着,如果有人更改了数据结构,那么他/她也必须更改for循环的代码
第三种选择是,当您必须使用嵌套循环并且必须处理多个迭代器时,迭代器可能会变得丑陋
看看下面的链接,看看迭代器容易出错的用法。
method3()
使用迭代器的地方是遍历列表的最佳方式。即使method1()
在幕后使用了Iterator
,如果您想修改循环中的列表,比如更新或删除,可能会导致ConcurrentModificationException
int index=1;list.forEach(e->System.out.println((index++)+“=”+e))代码>您可以将索引打印为well@Loki不,lambda中的变量必须是有效的final。您可以使用AtomicInteger
,尽管这有点过分。您是对的。不过,我留下了注释,这样每个人都可以像我刚才所做的那样学习关于使用迭代器删除元素的注释,在对列表进行迭代时更改列表不是一件坏事吗?糟糕的是,如果出现异常,它会在你脸上爆炸。@Davor不是通过迭代器的remove方法。文档“请注意,Iterator.remove是在迭代过程中修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改了基础集合,则该行为是未指定的。”能否提供更多详细信息或示例?这是一个低质量的回答,因为我可能是Kenster的副本,谢谢你让我知道可能的副本。我的问题更倾向于使用索引进行输出。但我/我们还发现,在新版本的Java 8中,现在有了新的列表循环方式。您想知道哪个更好,但没有提供评估哪个更好的标准。