java 为什么要有装箱和拆箱?

Python011

java 为什么要有装箱和拆箱?,第1张

把一个基本类型包装成一个类,一个是可以使这个类型具有很多可以调用的方法。二个是Java向面像对象语言的靠近。其实Java还不算是很纯的面向对象的语言。真正的面向对象,是没有基本数据类型的。它只有一种类型,就是对象。三个是在泛型中,基本类型是不可以做泛型参数的。如:List <int>list = new ArrayList<int>()这是不合法的。你只能这个样写List<Integer>list = new ArrayList<Integer>()也就是要用int型的包装类类型来解决基本类型不可以做泛型参数的问题 。一名话,包装类有更多的方法和用途, 而这是基本类型没有的!!!

最近面试也遇到了这个问题,思考总结了一下。

装箱:在基本类型的值赋值给包装类型时触发。例如:Integer a = 1

这时二进制文件中实际上是Integer a = Integer.valueOf(1)

拆箱:

1. 在包装类型赋值给基本类型时触发。

例如:Integer a = 1  // a 是Integer类型

int b = a  // 将Integer类型赋值给int类型,触发拆箱

2.在做运算符运算时触发。

例如:

Integer a = 1

Integer b = 2

System.out.print(a * b)//这时a*b在二进制文件中被编译成a.intValue() * b.intValue()

注意点:

==运算时,如果 a 和 b 都是Integer类型,则不会拆箱,因为==也可以直接比较对象,表示a和b是否指向同一对象地址。因此这里并不是比较值是否相等了。而如果a 和 b 中有一个是int类型,另一个是Integer 类型,则会触发拆箱,然后对两个int值进行比较。

Integer a = 128

Integer b = 128

Integer c = 127

Integer d = 127

System.out.print(a == b)// 返回false

System.out.print(c == d)// 返回true

原因是Integer 的装箱(Integer.valueOf())方法会自动缓存-128~127之间的值,多次装箱同一个值实际上用的是同一个对象,因此这里 a == b 是false,因为不是同一个对象,而 c==d 是true,因为使用缓存中的同一个对象,而不是因为值相等。

Integer a = 127

Integer e = new Integer(127)

Integer f  = Integer.intValue(127)

System.out.println(a == e)// 返回false,不是同一个对象

System.out.println(a == f)// 返回true,是缓存中同一个对象

欢迎修改补充...

装箱就是把基础类型封装成一个类。比如把int封装成Integer,这时你就不能把他当成一个数了,而是一个类了,对他的操作就需要用它的方法了。拆箱就是把类转换成基础类型。比如你算个加法什么的是不能用类的,就得把它转换成基本类型,jdk5以后已经可以自动转换了貌似。基本类型你应该懂的吧,就那八种