Java 为什么需要包装类,如何使用包装类?

2,376 total views, 3 views today

Java 是号称面向对象的语言,所有的类型都是引用类型。
Object 类是所有类的父类,而且是唯一不用指定明确继承的类。但是基本类型如 int 不是引用类型,也不是继承自 Object,所以 Java 需要一个这样的包装类来使其面向对象的完整性。
包装类同时也可以实现可空类型,即一个数值是空的。Java 集合中也只能放入包装类型,而不支持基本类型。

包装类与自动装箱拆箱

装箱就是 Java 将基本类型转换成对应的包装类型,比如将 int 转换成 Integer 对象。反之将 Integer 转换成 int 值,则称为拆箱。
装箱时,调用 valueOf 方法实现,比如 Integer.valueOf(100);
拆箱时,调用对应的 xxxValue 方法,比如 intValue() 方法。
自动装箱拆箱功能是 java1.5 后才有的。自动装箱拆箱时,由 Java 编译器自动实现转换。
赋值操作的时候,当两边类型不同,就会发生自动装箱拆箱。
自动装箱:
比如:Integer i = 100;
相当于编译器自动作以下的语法编译:

自动拆箱:

包装类相加时,也会自动拆箱。

自动装箱有性能损耗,在循环中应避免

上面的代码 sum+=i 可以看成 sum = sum + i,但是这个操作会把 sum 先拆箱,然后相加后再装箱。等价于下面的代码:
Integer sum = new Integer(sum.intValue() + i;);

包装类的比较

==符号是进行引用的比较。这个比较不会引起自动拆箱。

但是,由于 JVM 会缓存-128 到 127 的 Integer 对象,所以当包装类的值在-128 到 127 的范围内,判等比较的是同一个引用。

那么对于 128 这样数字的包装类,判等该怎么做?很简单,手动拆箱,或者用 equals 方法。

equals 方法会拆箱后,根据基本类型比较,所以比较的是两者值的大小。

包装类型和基本类型用==比较的时,会发生拆箱

当包装类和基本类型用 equals 比较时,会出现问题了。

发生了什么?看一下 equals 方法源码就知道了

基本类型会被自动装箱,放入 equals 方法,然后第一步会判等是否是 Integer 的类型,那么 long d 会被装箱成 Long,所以类型就不一致,直接不进行比较,返回 false。而 int c 会装箱成 Integer 而类型一致,可以继续比较下去。

总结

包装类是一个对象,基本类型不是。
包装类和基本类型可以互相转换,转换的过程称之为装箱拆箱,可以手动转换,也可自动转换。
包装类比较大小的时候有很多坑,比如:
==比较引用,Integer 类型只有在-128 到 127 的范围内,才会持有同一个引用。
equals 方法会先比较类型是否一致,不一致直接 false。
最佳的操作实践是,比较大小的时候,统一先手动拆箱,然后再比较值。

参考:

http://coderevisited.com/boxing-and-unboxing-in-java/

原创文章,转载请注明出处!http://www.javathings.top/java为什么需要包装类,如何使用包装类/

About: wusq


发表评论

邮箱地址不会被公开。 必填项已用*标注