【问题标题】:Which of these loops are more efficient?这些循环中哪个更有效?
【发布时间】:2014-02-15 14:15:33
【问题描述】:

我在 Java 中有这三个集合:

ArrayList<Integer> list1 = new ArrayList<Integer>(6000);
ArrayList<Integer> list2 = new ArrayList<Integer>(6000);
ArrayList<Integer> list3 = new ArrayList<Integer>(6000);

循环并设置为 0 哪个更有效?

for(int i =0; i < rHist.size(); i++) {
    list1.set[i] = 0;
    list2.set[i] = 0;
    list3.set[i] = 0;
}

还是这个?

for (int n : list1) {
    n = 0;
}


for (int n : list2) {
    n = 0;
}


for (int n : list3) {
    n = 0;
}

谢谢

【问题讨论】:

  • 变体 1) 不编译;变体 2) 不会将列表的内容设置为零。
  • 不要考虑微优化。他们无关紧要。首先使您的代码可编译,然后更正。
  • 哎呀,对不起我的错误

标签: java arraylist iterator


【解决方案1】:

正如 cmets 中已经提到的,这两种变体都没有达到您所说的目标。话虽如此,最好还是编写可读、可理解和简短的代码,并避免使用 Collections API 中提供的方法。类似的东西会用 6000 个零副本填满您的列表:

List<Integer> list = Collections.nCopies(6000, 0);

如果之后需要改变列表,则需要将其包装在可修改的列表中,如下所示:

List<Integer> list = new ArrayList<Integer>(Collections.nCopies(6000, 0));

【讨论】:

    【解决方案2】:

    第一个更好,因为如果在循环中将大小设置为 6000,您将循环一次而不是三次,并且集合应该看起来像这样 list1.set(i,0) 而不是 list1[i]=0

    如果你把它们都反编译了 uisng javap -c "appname" 让我们假设它们在主目录下,你可以看到你自己发生了什么

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      • 2017-03-11
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多