JDK5后基本数据类型都有一个对应的封装对象类型(boxed primitive),如int对应Integer。两者区别包括:
1.基本数据类型仅有数据值,而封装对象类型可能具有相同的数据值但是却是不同的对象,如:
int i=42,j=42;
System.out.println(i==j);//打印true
Integer a=Integer.valueOf(42);
Integer b=Integer.valueOf(42);
System.out.println(a==b);//打印false
2.封装对象类型具有一个特殊值null,基本数据类型不具有此值
3.基本数据类型在计算性能和占用内存上,比封装对象类型更好。
基本数据类型和封装对象类型可以自动转换(autoboxing,auto-unboxing),一般情况下,当基本数据类型和封装对象类型进行比较时,封装对象类型会自动转换为基本数据类型,然后才进行比较。频繁转换可能导致性能严重下降,如下:
Long sum = 0L;//注意sum为Long类型
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
以上代码每次计算过程,sum会先转换为long类型然后与i相加(因为i是long类型),计算结果会被转换为Long类型再赋给sum。即每次计算有2次转换过程,导致性能降低。
基本原则:
1.不要把基本数据类型和封装对象类型进行频繁比较(如上例的计算操作),否则会严重降低性能
2.注意当对两个封装对象类型进行“==”操作时,比较的是内存里两个对象是否相同,而不是比较对象拥有的数据值。应使用equals(), compareTo()比较封装对象类型的数据值
3.Collection,Map(特别是key值)所包含的元素仅能是封装对象类型,在添加、删除元素时不要使用基本数据类型的值