Java常用类-包装类
1. 包装类
-
基本数据类型不是对象,但有时候在实际应用中经常需要将基本类型数据转化为对象。
-
除了Character和Boolean以外,其他的包装类**(Integer、Long、Byte、Double、Float、Short)**都是抽象类java.lang.Number的子类。
-
Number抽象类提供了抽象方法intValue()、longValue()、floatValue()、doubleValue(),它的所有子类都需要提供实现。
基本数据类型 | 包装类 |
---|---|
byte | java.lang.Byte |
boolean | java.lang.Boolean |
short | java.lang.Short |
int | java.lang.Integer |
long | java.lang.Long |
float | java.lang.Float |
double | java.lang.Double |
char | java.lang.Character |
- 以下都以Integer为例,其他类似。
//包装类
public class Demo01 {
public static void main(String[] args) {
//基本数据类型转换成包装类对象
Integer a1 = new Integer(3);
Integer a2 = Integer.valueOf(5); //推荐
System.out.println("a1->" + a1);
System.out.println("a2->" + a2);
//把包装类对象转成基本数据类型
int b1 = a1.intValue();
double b2 = a1.doubleValue();
System.out.println("b1->" + b1);
System.out.println("b2->" + b2);
//把字符串转成包装类对象
Integer c1 = new Integer("123");
Integer c2 = Integer.valueOf("12");
System.out.println("c1->" + c1);
System.out.println("c2->" + c2);
//包装类转成字符串
String d1 = c1.toString();
System.out.println("d1->" + d1);
//包装类里定义的常用属性常量
System.out.println("最大int:"+ Integer.MAX_VALUE);
System.out.println("最小int:"+ Integer.MIN_VALUE);
}
}
2. 自动装箱与自动拆箱
-
JDK1.5后,Java引入了包装类的自动装箱(autoboxing)和自动拆箱(unboxing)。
-
自动装箱:在JDK1.5之前,Integer i = 5是错误的,必须要通过Integer i = new Integer(5)才可以实现基本数据类型转换成包装类;而在JDK1.5之后,Integer i = 5就可以实现基本数据转换成包装类,这是因为JVM执行了Integer i = Integer.valueOf(5)的操作,这就是Java的自动装箱。
-
自动拆箱:类似地,JVM也可以将一个对象拆箱转换为基本数据类型,不用再显式调用intValue()等方法。
public class Demo02 { public static void main(String[] args) { //自动装箱 Integer i = 5; //Integer i = Integer.valurOf(5); System.out.println(i); //5 //自动拆箱 i = i + 5; //int i = i.intvalue(); System.out.println(i); //10 } }
3. 包装类的缓存区
- 目的是提高效率。
- 原理:在自动装箱时,以Integer为例,如果在-128~127区间内,在类加载时就已经为该区间的每个数值创建了对象,并将这256个对象存放在数组cache[]中。当自动装箱过程发生时,或者手动调用valueOf()时,就会先判断是否在该区间,如果在,就直接获取数组中对应的包装类对象引用;如果不在,则通过new调用包装类的构造方法来创建对象。
//缓存区
public class Demo03 {
public static void main(String[] args) {
Integer a1 = 127;
Integer a2 = 127;
System.out.println(a1 == a2); //true
Integer b1 = 128; //Integer b1 = Integer.valueOf(128);
Integer b2 = 128;
System.out.println(b1 == b2); //false
Integer c1 = new Integer(1);
Integer c2 = new Integer(1);
System.out.println(c1 == c2); //false
Integer d1 = 123;
System.out.println(d1 == 123); //true 自动拆箱了 d1.intValue() == 123
}
}
- Integer、Byte、Short、Long、Character都有缓存区;
- Boolean也有缓存区,但不是缓存在数组中,而是缓存在了两个静态常量(TRUE/FALSE)中;
- Double、Float没有缓存区。