所有的基本类型都有一个与之对应的类,这些类称为包装器类。对象包装器类是不可改变的,即一旦构造类包装器类,就不允许更改包装在其中的值。同时,对象包装器类还是final
,因此不能定义它们的子类。
基本类型 | 包装器类 |
---|---|
int | Integer |
boolean | Boolean |
long | Long |
float | Float |
short | Short |
double | Double |
byte | Byte |
char | Character |
自动拆箱/装箱
- 自动装箱:可以直接将基本类型数据赋值给其对应的包装器类型。
- 自动装箱一定要类型严格匹配,包装器类型没有基本类型从小到大的转换。
- 在赋值的地方,都可以发生自动拆箱与装箱。
public class Outer {
public static void main(String[] args) {
//Double d=5; //不通过,类型不匹配。5是int
//Double b;
//b=10;//不通过
Double a=new Double(5); //通过,这样就不是自动装箱了
System.out.println(a);
int a1=9;
System.out.println(a1);
Outer outer=new Outer();
System.out.println(outer.display(a1));//参数传递的过程中也存在自动装箱/拆箱
}
public int display(Integer a){
System.out.println("a="+a);
return a+1;
}
}
- 自动拆箱:和自动装箱的过程相反,可以将包装器类对象赋值给一个基本类型。
- 在自动拆箱的过程中,赋值号左边是基本类型,因此自动拆箱可以类型不严格匹配。
public class Outer {
public static void main(String[] args) {
Integer a=5;
double d=a;
System.out.println(d+" "+a);
}
}
输出结果:
5.0 5
包装器类型基本方法
下面以java.lang.Integer为例进行说明,
方法 | 功能 |
---|---|
int intValue() | 返回Integer对象的值 |
static String toString(int i) | 以一个新String对象的形式返回给定数值的十进制表示 |
static String toString(int i,int radix) | 返回给定数值i的基于radix参数进制表示 |
static int parseInt(string s) | 返回字符串s表示的整数数值(默认为10进制) |
static int parseInt(string s,int radix) | 返回radix进制的字符串s表示的整数 |
static Integer valueOf(string s) | 返回用s表示的整数数值进行初始化后的新Integer对象(s的表示进制为10进制) |
static Integer valueOf(string s,int radix) | 用radix进制的字符串s表示的整数数值进行初始化后的新Integer对象 |
Integer(int value) | Integer类的构造函数 |
Integer(String s) | Integer类的构造函数,将字符串s表示的整数数值赋值给value(默认为10进制) |
包装器类
- 每个包装器类都有两个构造函数:
Type(type value);//以基本类型为参数来构造包转器类
Type(String value);//将字符串转换为相应的包装器类型
其中Type为相应的包装器类,type为其基本类型。
数值和字符串相互转换
- 每个包转器类有静态的
parseType(String value)
将字符串转换为基本类型。
比如Integer
类的方法为public static int parseInt(String s)
; - 数值向字符串的转换
- 基本类型->字符串。
String.valueOf()
方法 - 包转器类->字符串。
String.valueOf()
方法,自动拆箱的原因。 ""+基本类型(包转器类型)
- 基本类型->字符串。
- 字符串向数值类型转换
- 通过包转器类的构造函数
- 通过包装器类的
valueOf(String s)
返回一个包装器类 - 通过包转器类的静态方法
parseType()
(Type为相应的基本类型)返回一个基本类型数值。
数值型比较大小
1、 用>,<,<=,>=比较基本类型或包装器类型
- 比较运算符两边可以是任意数值类型的基本类型或包装器类型,两种类型可以混用。
- 如果两边有包装器类型,则先自动拆箱成基本类型,然后再进行比较。
- 每个包装器类都提供了一个静态compare方法,例如Integer
包装器类的compare方法为public static int compare(int x, int y)
。由于自动装箱的存在,因此也可以传递包装器类对象。
public class Outer {
public static void main(String[] args) {
System.out.println(5 >= new Double(5.0));//true
System.out.println(new Integer(5) >= new Double(5.0));//true;包装器类混合比较
System.out.println(5 > new Double(5.0));//false
System.out.println(Integer.compare(5,6));//-1
System.out.println(Integer.compare(new Integer(5),new Integer(6))); //-1,传递包装器类
System.out.println(new Integer(5).compareTo(new Integer(6))); //-1
}
}
2、相等性比较
- 每个包转器类有equals方法,调用该方法进行相同类对象之间的比较。
- 当使用==
进行比较的时候,如果==
两边都是包装器类型,那么比较将是引用地址是否相同;如果其中一边为包装器类型,另一边是基本类型,那么包装器类型先自动拆箱为基本类型,那么将是两个基本类型之间的比较。
- 当Integer中存储的数位于-128到127之间的short和int被包装到固定的对象中。如果通过自动装箱并且是范围在-128到127之间得到的Integer对象指向该固定的对象。通过 new
运算符一定是新建立的对象。
public class Outer {
public static void main(String[] args) {
System.out.println(new Integer(5)==new Integer(5));//false,两个包装器类对象进行比较
System.out.println(5==new Integer(5));//true,基本类型和包装器类型进行比较
Integer a=10;
Integer b=10;
System.out.println(a==b); //true,通过自动装箱并且在-128到127之间
Integer x=200;
Integer y=200;
System.out.println(x==y); //false,超出范围
}
}