2011-09-30 77 views
9

我想問在Java中是否應該避免自動裝箱。由於有些方法需要一個基本類型'double'並且傳遞一個'Double'對象作爲參數,所以應該避免這種情況,因爲編譯器會將您傳遞的對象解開並且可能很重。應該在Java中避免自動裝箱

回答

7

這就是Java的說明說上autoboxing

身高基本類型

使用原始類型那裏不需要兩個 原因對象。

  1. 原始類型可能比相應的包裝器類型快很多,並且永遠不會變慢。
  2. 包裝 類型的不變性(創建後無法更改)可能會使其無法使用。
  3. 可能會有一些意外的行爲涉及==(比較 引用)和.equals()(比較值)。示例請參閱下面的參考文獻 。
+1

具體的異常行爲包括NullPointerException異常。 –

+0

autoboxing驚喜:http://www.theserverside.com/news/thread.tss?thread_id=27129 – 2011-09-30 13:07:56

+0

是的,但問題是關於'autoboxing'。如果他會問'我應該在封裝類中使用原語',那麼當然你是對的,否則自動裝箱本身不會影響現代JVM的性能 - 至少從我所知道的。 – Kris

4

經驗法則是:如果可能,總是使用原語。

有些情況下,這是不可能的,如集合,所以只有使用包裝。

1

如果談論性能,您不必避免自動裝箱,JVM應該處理該問題。你唯一應該考慮的是你的代碼的可讀性。

4

這是一個設計選擇,並不平凡地回答每一個案件。

有幾個項目是可能影響你的決定:

優點:

  • 自動裝箱和自動拆箱可以使你的代碼容易閱讀:

    省去所有不必要的.doubleValue()Double.valueOf()減少了視覺噪音,並可以使您的代碼更易於閱讀。

  • 自動裝箱讓您輕鬆使用原始值的集合(如List<Double>,...)

缺點:

  • 過多的,不必要的自動裝箱和自動拆箱可以阻礙你的表現。

    例如,如果您有回報一個double預計一個double另一個API,但你辦理值作爲之間的,那麼你在做無用的自動裝箱的API 。

  • 自動拆箱可以引入一個NullPointerException,你不要指望它:使用自動裝箱值集合

    public void frobnicate(Double d) { 
        double result = d/2; 
        // ... 
    } 
    
  • 使用很多更多的內存比類似double[]例如。