`
bingooh
  • 浏览: 52842 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

8.49 优先使用基本数据类型代替封装对象类型

 
阅读更多

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值)所包含的元素仅能是封装对象类型,在添加、删除元素时不要使用基本数据类型的值

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics