Java基本型別自動裝箱的效能成本 -Coffee Talk

發表於2020-12-15

將整數加入集合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不會報告任何原始到物件的轉換問題。

 

相關文章