Java基本类型自动装箱的性能成本 -Coffee Talk


将整数加入集合Collection或Map中时,是直接将int原始类型加入还是变成Integer整数对象类型加入呢?这两者有什么区别?
JDK 1.5版引入了Java原语类型的自动装箱。这意味着当在需要引用类型的任何地方使用基本类型时,包装器类将自动创建。因此,在JVM的JDK 1.5版本之后,上述用例无需使用包装器类。Java装箱和原始类型的自动装箱将为您处理:

int x = 10;
ArrayList<E> list = new ArrayList();
list.add(10); //这是Java中的原始类型自动装箱

使用Java Flight Recorder和JDK Mission Control Eclipse插件对该程序进行快速分析会触发红色警告,将“原始到对象转换”标记为有问题。自动装箱导致性能问题。使用自动装箱功能时,Java Mission Control显示了垃圾回收例程会影响性能。
解决办法是加入整数型对象Integer,如:

 map.put(Integer.valueOf(i), 
              new SnoopInt(Integer.valueOf(i)));
public final class SnoopInt {
  final Integer id;
  SnoopInt(Integer id) { this.id = id; }
  Integer getId() { return id; }
}

进行了这些较小的更改后,再次启动Java Flight Recorder时,Java原语类型装箱和拆箱性能问题就消失了。垃圾回收没有明显增加,并且在Java Flight Recorder运行之后,Java Mission Control不会报告任何原始到对象的转换问题。