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
總結 |
以上內容若有錯誤之處,還請各位大神指點,不勝感激,同時也歡迎各位一起來探討相關問題。
參考資料 |