- 所有的基本类型都有一个与之对应的类,这些类称为包装器(Wrapper)。 这些包装器类名为:Integer,Long,Float,Double,Short,Byte,Character,Void,Boolean(前六个类派生于公共的父类Number)。对象的包装器类都是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时,对象包装器类还是final,因此不能定义它们的子类。包含在包装器中的值是不会改变的。
- 由于每个值分别包装在对象中,所以ArrayList<Integer>的效率远远低于int[] 数组。
- 自动装箱/拆箱
-
- ArrayList<Integer> arl =new ArrayList<>();
- arl.add(3);将自动变换成arl.add(Integer.valueOf(3));-----自动装箱,将基本类型赋给包装器类型。
- int i=arl.get(n);自动转换为int i=arl.get(n).intValue();----自动拆箱,将包装器类型赋给基本类型。
- 在算术表达式中也能够实现自动装箱/拆箱。
-
- Integer i=9; i++;
- 编译器将自动插入一条拆箱指令,然后进行自增运算,最后再将结果装箱。
- 包装器对象的比较使用equals()方法,不能使用==(==比较的是地址)。
- 包装器类引用可以为null。
- 如果在一个表达式中混合使用Integer , Double类型,Integer值会自动拆箱,提升为double,再装箱为Double。
Integer
integer=4;
Integer integer2=4;
Double double1=4.0;
double d=4.0;
System.out.println(double1==d);//包装器类型与基本类型
System.out.println(new Integer(2)==new Integer(2));//通过构造函数
System.out.println(integer==integer2);//通过自动装箱,且介于-128--127
System.out.println(new Integer(4)==integer);//构造函数与自动装箱
System.out.println(integer+double1);
输出结果为:
true
false
true
false
8.0
- 装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的方法调用,虚拟机只是执行这些字节码。
- 包装类型与基本类型的比较
-
- 包装类是引用类型,但可以直接用"=="跟基本类型比较
- 包装类与包装类的比较
-
- 如果包装类对象都是通过构造方法创建的:遵循对象的比较规则,即用"=="比较的是地址,用equals()比较对象的内容
- 如果包装类对象都是通过自动装箱创建,且属于[-128,127],可以用"=="比较他们的值是否相等;如果在[-128,127]之外,那么遵循对象的比较规则
- 如果两个对象分别通过自动装箱和构造方法创建的,不论是不是属于[-128,127],都遵循对象的比较规则。
- 关于[-128,127]:
-
- Integer类在初始化时,一个内部类的静态代码块将[-128,127]的每个整数都创建了Integer对象,并保存在一个数组中,今后在将[-128,127]中的一个整数自动装箱成Integer对象时,则直接指向这个数组中对应的对象,因此可以用"=="比较它们的值是否相等
- 自动装箱规范要求boolean,byte,char<=127,介于-128--127之间的short和int被包装到固定的对象中。
- 字符串型的值转为基本类型:
-
- 用包装类的静态的parse...(String s)方法。注意没有Character类,String的toCharArray()方法转为字符数组
- 字符串转包装器类型
-
- 用包装类的构造器
- 调用包装器类的valueOf(String s)
- 基本类型转为字符串
-
- 静态方法String.valueOf();
- 基本变量+"";
public int
intValue()
以
int
类型返回该
Integer
的值。-----拆箱
public long
longValue()
以
long
类型返回该
Integer
的值
public static
Integer
valueOf(int i)
返回一个表示指定的
int 值的
Integer 实例。-----装箱
返回保存指定的
String
的值的
Integer
对象。
public static int
parseInt(
String s)
将字符串参数作为有符号的十进制整数进行解析