Java泛型的Boxing & Unboxing

先看代码

 1 import java.util.*;
2
3 public class Test
4 {
5 public static int sum(List<Integer> ints)
6 {
7 int s = 0;
8 for (int n : ints)
9 s += n;
10 return s;
11 }
12
13 public static Integer sumIntegers(List<Integer> ints)
14 {
15 Integer s = 0;
16 for (Integer n : ints)
17 s += n;
18 return s;
19 }
20
21 public static void main(String[] args)
22 {
23 List<Integer> bigs = Arrays.asList(100, 200, 300);
24 System.out.println(sumIntegers(bigs) == sum(bigs)); // 1
25 System.out.println(sumIntegers(bigs) != sumIntegers(bigs)); // 2
26
27 List<Integer> smalls = Arrays.asList(1, 2, 3);
28 System.out.println(sumIntegers(smalls) == sum(smalls)); // 3
29 System.out.println(sumIntegers(smalls) == sumIntegers(smalls)); // 4
30 }
31 }

注释1处,会造成sumInteger(bigs)拆箱(Unboxing),所以==比较的是值的相等性。

注释2处,比较的是两个Integer对象的相等性,由于使用的是==操作符而不是equals方法,所以两者不等。

注释3同注释1。

注释4处是个很有意思的现象,值得解释下。

当int,short取值在-128到127,char取值在\u0000到\u007F,byte类型,boolean类型的装箱(Boxing)值被缓存。所以注释4处返回的两个Integer对象是相同的对象——即,6被装箱(Boxing)之后的Integer对象。

结论就是,无论如何,如果要比较reference对象始终用equals方法,而对于原始数据类型始终用==操作符。

posted on 2011-12-26 10:13  cssin  阅读(386)  评论(0)    收藏  举报

导航