基本类型: byte short int long float double char boolean
包装类: Byte Short Integer Long Float Double Character Boolean
一、基本类型只有值,而包装类还具有和值不一样的同一性
1
2
3
4
5
6
7
8
9
10
11
12public void integerTest(){ // 基本类型 int a = 10; int b = 10; System.out.println("a==b:" + (a == b));//true //包装类型 Integer a1 = new Integer(20); Integer b1 = new Integer(20); System.out.println("a1.equals(b1):" + a1.equals(b1));//true System.out.println("a1==b1:" + (a1 == b1));//false }
基本类型只有值,可以直接拿“= =”进行比较。通过new创建的包装类,调用equals方法可以发现其具有和基本类型相同的值,但是直接拿“==”比较两个值相同的包装类结果却是false,这说明包装类具有和值不一样的同一性。包装类之所以具有不同的同一性,是因为包装类属于引用类型,直接拿“= =”进行比较,其实比较的是地址值,所以不同。
二、基本类型具有完备的值,而包装类具有一个非功能值null
基本数据类型使用时必须进行赋值,否则无法使用,因此当我们定义一个基本类型的数据时它就具有完备的值。包装类型如果未赋值会有一个默认值null,此时如果忘记赋值直接使用就会报java.lang.NullPointerException,会带来一些隐患。
三、基本类型比包装类更节省空间和时间
通过new方式创建的包装类,两个相同的值,会创建两个对象,占用空间更大。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23/** * Compares this object to the specified object. The result is * {@code true} if and only if the argument is not * {@code null} and is an {@code Integer} object that * contains the same {@code int} value as this object. * * @param obj the object to compare with. * @return {@code true} if the objects are the same; * {@code false} otherwise. */ public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
基本类型在比较值时可以直接使用= =进行;而包装类需要使用equals方法,当我们点进去equals方法就会发现,包装类重写了Object的该方法,先将包装类拆箱转换成基本类型,然后再使用 = =进行比较,因此从时间上来看包装类更加耗时。
四、包装类使用场景
既然包装类有这么多缺点,那为什么还要使用它呢?因为在有些场景下无法使用基本类型,只能使用包装类。例如:在集合中的元素、键和值不允许使用基本类型,只能使用包装类;使用反射调用方法时必须使用包装类。
备注:本文参考《Effective Java》
最后
以上就是深情山水最近收集整理的关于基本类型与包装类的区别的全部内容,更多相关基本类型与包装类内容请搜索靠谱客的其他文章。
发表评论 取消回复