最近做一些项目时想到基本类型和包装类型的区别,比如:int->Integer,double->Double等主要区别有以下几点:
1.包装类型可以为空,而基本类型必须初始化:
private Integer age;private double money;age使用了包装类型可以为空,此时还没有分配内存空间,money使用的是double,此时值是存储在栈里,所以需要初始化。(string特殊)。
同时阿里巴巴开发手册这样说:数据库的查询结果可能是 null,如果使用基本类型的话,因为要自动拆箱(将包装类型转为基本类型,比如说把 Integer 对象转换成 int 值),就会抛出 NullPointerException
的异常。
2.包装类型可用于泛型,而基本类型不可以
List<int> list = new ArrayList<>(); // 提示 Syntax error, insert "Dimensions" to complete ReferenceType
List<Integer> list = new ArrayList<>();
3.存储地址和高效性
我们在使用包装类型的时候,相当于是object的存储方式,相比之下值存储在栈里,栈的存取速率是要快于堆的,所以一般我们使用值类型更加高效。
4.包装类型的值比较(string 特殊):
两个包装类型的值相同,但比较结果却是出乎意料:
Integer a= new Integer(10);
Integer b= new Integer(10);
System.out.println(a== b); // false
System.out.println(a.equals(b)); // true
由于包装类型是对象,==是比较栈里的引用,而equal是比较堆里的值
5.装箱和拆箱
包装转转成值类型是拆箱,反过来就是装箱,我们来看看下面几个比较:
int a = 100;
Integer b = 100;
System.out.println(a == b);//true
Integer c = 100;
Integer d = 100;
System.out.println(c == d);//true
c = 200;
d = 200;
System.out.println(c == d);//false
是不是很意外?我希望大家记住一点:当需要进行自动装箱时,如果数字在 -128 至 127 之间时,会直接使用缓存中的对象,而不是重新创建一个对象。