foreach循环由原语或Java中的盒装类

时间:2015-03-06 11:08:31

标签: java generics collections boxing unboxing

目前我正在读一本书" Java Generics and Collections"我发现了一个有趣的代码:

List<Integer> ints = Arrays.asList(1,2,3);
int s = 0;
for (int n : ints) { s += n; }
assert s == 6;

这里foreach循环迭代原语:

for (int n : ints) { ... }

但是,Eclipse IDE建议我迭代盒装类型:

for (Integer n : ints) { ... }

使用一种或另一种迭代方式有什么好处吗?

2 个答案:

答案 0 :(得分:5)

拳击/拆箱在运行时有成本。

  • 如果你打算在循环体内取消Integer一次,就像你一样,它不会产生太大影响。
  • 如果您在循环正文中多次取消Integer,请最好使用for(int i : ints)
  • 将其拆箱一次
  • 如果您要在循环体中使用Integer,那么使用int会导致不必要的unbox / box操作。

例如:

List<Integer> subList = new ArrayList<>();

for (Integer i : ints) { //better not to unbox
  if (someCondition(i)) subList.add(i);
}

for (int i : ints) { //better to unbox once
  int a = i;
  int b = 2 * i;
  sum += a + b - i;
}

答案 1 :(得分:1)

    List<Integer> ints = Arrays.asList(1,2,3); //here lists is of type Integer which is boxed type
    int s = 0; //s is primitive type

请记住,我们只能比较:

1。)原始类型的原语

2。)盒装盒装类型

我们可以说

列表整数可以表示为:

    [Integer.valueof(1), Integer.valueof(2), Integer.valueof(3)]

所以,在下面的代码中

    for (int n : ints) // in every loop ints current index value which is an Integer is unboxed and assigned to 'int n'

当读取以下代码时..

     s += n;// int n is added to int s (primitive added to primitive ie; no conversion done here)

2.)现在第二种方法

    for (Integer n : ints) { ... }// here, since 'n' is also boxed so no conversion takes place

但是,遇到以下行

    s += n; // boxed Integer n is unboxed to a primitive and added to primitive 's' (so unboxing/conversion happens in each addition)

所以,这就是两者之间的差异,但两种方法中的转换次数是相同的。