一、基本数据类型对象包装类
为了方便操作,基本数据类型值,将其封装成了对象,在对象中定义了属性和行为丰富了该数据的操作。
用于描述该对象的类就称为基本数据类型对象包装类。
基本数据类型 | 对象包装类 |
byte | Byte |
int | Integer |
float | Float |
char | Character |
short | Short |
long | Long |
double | Double |
boolean | Boolean |
基本类型---->字符串
1.基本类型数值+" ";
2.String类中的静态方法 valueOf(基本类型数值);
3.用Intger的静态方法valueOf(基本数据类型);
字符串---->基本类型
1.使用包装类中静态方法 xxx paseXXX("xxx类型字符串");只有Character没有pares方法,它用toString();
2.如果字符串被Integer进行对象封装.
可以使用另一个非静态方法,intValue();将一个Integer对象转成基本数据类型值.
二、整数的各个进制转换
十进制---->其他进制
Integer.toBinaryString(int i);十进制--->二进制
toHexString(int i);十进制--->十六进制
toOctalString(int i);十进制--->八进制
toString(int i,int radix);十进制--->任意进制
其他进制--->十进制
parseInt(String s,int radix);//radix---基数
三、JDK1.5自动装箱和拆箱
两者有什么差别,包装类是类,是对象,而基本类型是有值的“变量”,再细化一点,就是包装类的实例(对象)创建在堆上,而基本类型创建在栈上,这是JAVA为了程序的速度考虑做出的优化,那么既然是创建在栈上,所以基本类型都有大小的规定(每种基本类型所占的字节是一定的)。扯句题外话,那么为什么java的设计者要设计出包装类呢?我的理解是既然java作为一门面向对象的语言,那么包装类作为类,可以容纳更多的信息,可以提供更多的操作。另外,包装类都实现了Comparable接口,可以实现对象之间的比较,所以包装类之间的比较尽量用compareTo,而不是><=这些运算符。切记。
在JDK1.5之前,我们要实现基本类型和包装类之间的转换,大多是通过包装类提供的方法,Integer i = Integer.valueOf(5)或者int j = i.intValue()来做互相转换的。JDK1.5之后,编译器会在我们做赋值操作(这里所说的赋值操作不包括构造函数,我们后面会讲)的时候帮我们自动完成基本类型和包装类之间的相互转换。
上面我们所说的赋值操作,基本上可以分为两种情况,一种是显式赋值,另一种是隐式赋值.
Integer x = new intgert(4);可以直接写成
integer x =4;// 自动装箱
显式赋值:我们可以理解为有赋值符号出现的情况,这里编译器会自动的帮你完成把4这个int的基本类型装箱成包装类实例的工作,这样就不用我们再手动的转换了。
x = x +5;//自动拆箱,通过intValue方法;隐式赋值:就是没有复制符号出现的情况,这点我们很多人经常忽略,比如方法调用时候的参数传递,比如我们有一个接受Integer类型参数的方法(void method(Integer i)),我们在调用的时候可以直接传递一个基本类型的实参进去(method(5)),这时候编译器会自动的将我们传递进去的实参装箱成包装类,从而完成对方法的调用。很简单的一个过程,里面的原理却不简单,这是因为,方法调用的时候,在内存中的栈上,首先会为方法的形参创建内存区域,然后将我们传递进去的实参赋值给形参,看到没,就是在这时,发生了赋值操作,才会让编译器完成装箱操作。当然,方法执行完后,栈上有关形参的内存区域会被回收。
还有我们要记住一点,就是编译器的装箱/拆箱原则,就是基本类型可以先加宽(比如int转换为long),再转变成宽类型的包装类(Long),但是不能转变成宽类型的包装类型。比如我们有个方法 void method(long l),我们通过method(5)是可以调用该方法的,因为int类型的5被加宽成了long类型;但是如果这个方法变成void method(Long l),我们通过method(5)就不能调用它了,因为int类型的5是不能直接转换成Long包装类的。切记。
需要注意:Integer比int多一个值------null,在使用时,如果Integer x = null;上面的代码就回出现NullPointerException.所以需要做一个判断.
Integer a = new Integer(128);
Integer b = new Integer(128);
a==b;为false,因为它们开辟的空间地址不一样;
a.equals(b)为true,因为值相同覆盖了Object方法;
Integer x = 127;
integer y = 127;
x==y;为true,因为JDK1.5后自动装箱中如果是一个字节,数据会被共享,不开辟空间;
在这一块,java的设计者采用了cache pool的设计模式,在Integer这个类里面有一个长度为256的静态Integer数组,里面存储了从-128到127的Integer对象,当我们传递进去的参数在这个范围之内时,这个方法会返回该数据中实现保存的Integer对象实例,只有超过该范围时,才会返回new出来的Integer对象实例。
x.equals(y)为true,因为值相同;
PS:==符号比较的基本类型的值,对对象类型而言,比较的是对象的内存地址。
自动装箱:基本数据类型赋值给引用数据类型;自动拆箱:当引用数据类型与基本数据运算时.