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

Python017

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

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

java自动装箱和拆箱

基本数据类型,如int,float,double,boolean,char,byte,不具备对象的特征,不能调用方法。

装箱:将基本类型转换成包装类对象

int i=10

Integer x=new Integer(i)手动装箱

Integer y=10自动装箱

拆箱:将包装类对象转换成基本类型的值

Integer j=new Integer(8)

int m=j.intValue()//手动拆箱

int n=j//自动拆箱

java为什么要引入自动装箱和拆箱的功能?又是怎么实现的呢?

主要是用于java集合中,List<Inteter>list=new ArrayList<Integer>()

list集合如果要放整数的话,只能放对象,不能放基本类型,因此需要将整数自动装箱成对象。

实现原理:javac编译器的语法糖

public class Main {

public static void main(String[] args) {

Integer i1 = 100

Integer i2 = 100

Integer i3 = 200

Integer i4 = 200

System.out.println(i1==i2)

System.out.println(i3==i4)

}

}

//结果为:true false

在通过Integer.valueOf()方法创建Integer对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用(位于堆对象池中);否则创建一个新的Integer对象(创建在java堆中)。上面的代码中i1和i2的数值为100,因此会直接从cache中取已经存在的对象,所以i1和i2指向的是同一个对象,而i3和i4则是分别指向不同的对象。

public class Main {

public static void main(String[] args) {

Double i1 = 100.0

Double i2 = 100.0

Double i3 = 200.0

Double i4 = 200.0

System.out.println(i1==i2)

System.out.println(i3==i4)

}

}

//结果为:false false

为什么Double类的valueOf方法会采用与Integer类的valueOf方法不同的实现呢?很简单:在某个范围内的整型数值的个数是有限的,而浮点数却不是。

public class Main {

public static void main(String[] args) {

Boolean i1 = false

Boolean i2 = false

Boolean i3 = true

Boolean i4 = true

System.out.println(i1==i2)

System.out.println(i3==i4)

}

}

//结果为:true true

至于为什么是这个结果,同样地,看了Boolean类的源码也会一目了然。下面是Boolean的valueOf方法的具体实现:

public static Boolean valueOf(boolean b) {

return (b ? TRUE : FALSE)

}

public class H {

public static void main(String[] args) {

Integer m=10

int n=10

System.out.println(m==n)

}

}

//结果为:true