java - Java 中按原语或装箱类进行 foreach 循环

标签 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) { ... }

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

最佳答案

装箱/拆箱在运行时会产生成本。

  • 如果您打算在循环体内对 Integer 进行一次拆箱(就像您所做的那样),那么不会有太大区别。
  • 如果在循环体中多次拆箱Integer,最好使用for(int i : ints)拆箱一次
  • 如果您要在循环体中使用 Integer,那么使用 int 会导致不必要的拆箱/装箱操作。

例如:

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;
}

关于java - Java 中按原语或装箱类进行 foreach 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28897524/

相关文章:

java - 输入/输出 Java 示例

java - 在 arrayList 中添加对象

java - 自定义任务执行器或 "am I reinventing the wheel?"

Java 连接到 MySql 数据库,NullPointerException

java - 原始类型成员的通用类型丢失

java - 如何序列化将对象保存在文件编辑上或清空它并再次填充它(查看前)?

java - 将 Web 应用程序从 Eclipse 3.1 移动到 3.6

c# - 从泛型类派生的类中缺少构造函数

typescript - typescript 中带有n个参数的通用 curry 函数

c# - 在 C# 中使用 Linq 匹配 2 个集合之间的元素