目前我正在读一本书" 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) { ... }
使用一种或另一种迭代方式有什么好处吗?
答案 0 :(得分:5)
拳击/拆箱在运行时有成本。
Integer
一次,就像你一样,它不会产生太大影响。Integer
,请最好使用for(int i : ints)
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)
所以,这就是两者之间的差异,但两种方法中的转换次数是相同的。