天天看点

包装类及其用法(装箱拆箱)

基本数据类型的包装类

Java是面向对象的编程语言,但他也包含了8种基本数据类型,这8个基本数据类型不支持面向对象的编程机制,基本数据类型的数据也不具备“对象”的特征:没有属性,方法可以被调用;
这8种基本数据类型带来了一定的方便之处:可以进行简单有效的常规数据处理;但某些时候,基本数据类型就会有写制约:所有引用类型的变量都继承了Object类,都可以当成Object类型变量使用,但基本数据类型就不行,为了解决8种基本类型不能当成Object类型变量使用的问题,Java提供了包装类的概念,为8种基本数据类型分别定义了相应的引用类型,并称之为基本数据类型的包装类。
基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
char Character
float Float
double Double
boolean Boolean

把基本数据类型包装成包装类实例是通过对应包装类的构造器来实现的,8个包装类中除了Character之外,还可以通过传入一个字符串参数来构建包装类对象。

public class Test{
	public static void main(String[] args){
		//通过构造器把boolean包装成包装类对象
		boolean b = true;
		Boolean b1 = new Boolean(b);
		//通过构造器把int包装成包装类对象
		int i = 9;
		Integer i1 = new Integer(i);
		//把一个字符串转换成Float对象
		Float f = new Float("3.1415");
		//把一个字符串转换成Boolean对象
		Boolean bo = new Boolean("false"); 
	}
}
           
当用一个字符串来创建对象,传入的字符串不能转换成对应基本类型变量时,运行时会出现java.lang.NumberFormatException异常;
当用一个字符串创建Boolean对象时,如果传入的是true或者true不同字母大小写变化的字符,如True,tRue,等时,都会创建true对应的对象,如果不是true则会创建false的对象;

获得包装类对象的基本数据类型变量

格式:xxxValue()

//取出Integer对象里的int变量
int i = in.intValue();
//取出Float里的float变量
float f = fl.floatValue();
           

intValue():int–返回类型

longValue():long

shortValue():short

floatValue():float

doubleValue():double

byteValue():byte

自动装箱,自动拆箱

JDK1.5提供了自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)功能;

自动装箱(Autoboxing):可以直接把一个基本类型变量直接赋给对应的包装类变量;

自动拆箱(AutoUnboxing):允许直接把包装类对象直接赋给一个对应的基本类型变量;

注意:判断两个包装类是否相等要用equals()方法;

注意:对于自动装箱时的Integer var = ?时,在-128~127中间的数的赋值Integer对象会在Integer常量池产生,之后再赋值会复用已有对象,而在这个数值范围之外的赋值会在堆上产生,不会复用已有对象;
//Integer num1 = 130 ;
//Integer num2 = 130 ;
//System.out.println(num1 == num2);//false
Integer num1 = 120 ;
Integer num2 = 120 ;
System.out.println(num1 == num2);//true
           
Integer num1 = new Integer(10) ;
Integer num2 = new Integer(10) ;
System.out.println(num1 == num2);//false
System.out.println(num1 == new Integer(10));//false
System.out.println(num1.equals(new Integer(10)));//true
           

使用new的对象是引用类型变量,用

==

比较引用类型比较的是地址,num1和num2是两个对象,所以地址肯定是不一样的;

引用类型比较内容时因该使用equals()方法;

阿里编码规范:使用int还是Integer?

关于基本数据类型与包装数据类型的使用标准如下:

1) 【强制】所有的 POJO 类属性必须使用包装数据类型。

2) 【强制】RPC 方法的返回值和参数必须使用包装数据类型。

3) 【推荐】所有的局部变量使用基本数据类