1. 程式人生 > >Java中包裝類作用及注意點

Java中包裝類作用及注意點

轉載地址: https://blog.csdn.net/liu_005/article/details/79585956

Java中對每種基本型別都有一個對應的包裝類,這裡主要講解包裝類的作用和包裝類使用時的一些注意點。

包裝類的作用

作用主要有以下兩方面:  - 編碼過程中只接收物件的情況,比如List中只能存入物件,不能存入基本資料型別;比如一個方法的引數是Object時,不能傳入基本資料型別,但可以傳入對應的包裝類;  - 方便型別之間的轉換,比如String和int之間的轉換可以通過int的包裝類Integer來實現,具體如下。 int a = new Integer("123");  或者 int a = Integer.parseInt("123");

包裝類使用時的注意點

這裡先看一段程式碼:

<span style="color:rgba(0, 0, 0, 0.75)"><span style="color:#000000"><code><span style="color:#abb2bf">public</span> <span style="color:#abb2bf">class</span> StudyBox {
    <span style="color:#abb2bf">public</span> <span style="color:#abb2bf">static</span> <span style="color:#abb2bf">void</span> <span style="color:#abb2bf">main</span>(String[] args) {

        Integer a = <span style="color:#abb2bf">100</span>, b = <span style="color:#abb2bf">100</span>, c = <span style="color:#abb2bf">150</span>, d = <span style="color:#abb2bf">150</span>;
        Long e = <span style="color:#abb2bf">150</span>l;
        System.<span style="color:#abb2bf">out</span>.println(a == b);
        System.<span style="color:#abb2bf">out</span>.println(c == d);
        System.<span style="color:#abb2bf">out</span>.println(c.equals(d));
        System.<span style="color:#abb2bf">out</span>.println(d.equals(e));
        System.<span style="color:#abb2bf">out</span>.println(e.equals(d));
    }

}
</code></span></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

這段程式碼的輸出結果如下:

<span style="color:rgba(0, 0, 0, 0.75)"><span style="color:#000000"><code><span style="color:#abb2bf">true</span>
<span style="color:#abb2bf">false</span>
<span style="color:#abb2bf">true</span>
<span style="color:#abb2bf">false</span>
<span style="color:#abb2bf">false</span></code></span></span>
  • 1
  • 2
  • 3
  • 4
  • 5

第一個、第三個輸出很好理解,但是其他三個輸出可能就會讓人有些疑惑。

程式碼解釋

這裡以int型對應的包裝類Integer為例來說明:  在上段程式碼中,初始化Integer型別的a,是將int型資料100裝箱然後賦值給變數a,其中裝箱操作使用的是靜態工廠方法valueOf(int i),下面我們看一下這個方法的原始碼:

<span style="color:rgba(0, 0, 0, 0.75)"><span style="color:#000000"><code>/**
 * Returns an {<span style="color:#abb2bf">@code</span> Integer} instance representing the specified
 * {<span style="color:#abb2bf">@code</span> int} value.  If a <span style="color:#abb2bf">new</span> {<span style="color:#abb2bf">@code</span> Integer} instance <span style="color:#abb2bf">is</span> <span style="color:#abb2bf">not</span>
 * required, <span style="color:#abb2bf">this</span> method should generally be used <span style="color:#abb2bf">in</span> preference to
 * the constructor {<span style="color:#abb2bf">@link</span> <span style="color:#abb2bf">#Integer(int)}, as this method is likely</span>
 * to yield significantly better space <span style="color:#abb2bf">and</span> time performance <span style="color:#abb2bf">by</span>
 * caching frequently requested values.
 *
 * This method will always cache values <span style="color:#abb2bf">in</span> the range -<span style="color:#abb2bf">128</span> to <span style="color:#abb2bf">127</span>,
 * inclusive, <span style="color:#abb2bf">and</span> may cache other values outside <span style="color:#abb2bf">of</span> <span style="color:#abb2bf">this</span> range.
 *
 * <span style="color:#abb2bf">@param</span>  i an {<span style="color:#abb2bf">@code</span> int} value.
 * <span style="color:#abb2bf">@return</span> an {<span style="color:#abb2bf">@code</span> Integer} instance representing {<span style="color:#abb2bf">@code</span> i}.
 * <span style="color:#abb2bf">@since</span>  <span style="color:#abb2bf">1.5</span>
 */
public static Integer valueOf(int i) {
    <span style="color:#abb2bf">if</span> (i >= IntegerCache.low && i <= IntegerCache.high)
        <span style="color:#abb2bf">return</span> IntegerCache.cache[i + (-IntegerCache.low)];
    <span style="color:#abb2bf">return</span> <span style="color:#abb2bf">new</span> Integer(i);
}</code></span></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在這個方法註釋的第二段中,說明了這個方法一定會快取-128到127的值,也有可能會快取這個範圍以外的值,這就是上面程式碼中第二個輸出是false的原因。即-128到127的值會被Integer類快取起來(在Integer類中通過IntegerCache類來實現),從valueOf(int i)的程式碼中可以看出,物件a和b是同一個物件,所以==比較是true;而c和d是不同的物件,所以==比較是false。

另外,使用equals()來進行物件比較時,Integer會先檢查型別是否一致,若不一致直接返回false,這也就是第四個和第五個輸出false的原因。具體如以下原始碼:

<span style="color:rgba(0, 0, 0, 0.75)"><span style="color:#000000"><code><span style="color:#abb2bf">public</span> <span style="color:#abb2bf">boolean</span> <span style="color:#abb2bf">equals</span>(Object obj) {
     <span style="color:#abb2bf">if</span> (obj <span style="color:#abb2bf">instanceof</span> Integer) {
          <span style="color:#abb2bf">return</span> value == ((Integer)obj).intValue();
      }
      <span style="color:#abb2bf">return</span> <span style="color:#abb2bf">false</span>;
}</code></span></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
總結

以上內容若有錯誤之處,還請各位大神指點,不勝感激,同時也歡迎各位一起來探討相關問題。

參考資料