包装类
什么是包装类?
- 基本数据类型所对应的引用数据类型。
- Object可统一所有数据,包装类的默认值null。
- 包装类中实际上就是持有了一个基本类型的属性,作为数据的存储空间(Byte中有一个byte属性),还提供了常用的转型方法,以及常量,既可以存储值,又具备了一系列的转型方法和常用常量,比直接使用基本类型的功能更强大。
- 包装类中提供了若干转型的方法,可以让自身类型与其他包装类型、基本类型、字符串相互之间进行转换。
public class TestEncapsulation {
public static void main(String[] args) {
Byte b1 = new Byte((byte)10);//基于基本类型byte进行构建
Byte b2 = new Byte("20");//基于字符串进行构建
System.out.println(b1.byteValue());
System.out.println(b1.doubleValue());
Short s2 = new Short("12");
System.out.println(s2.byteValue());
System.out.println(Short.MAX_VALUE);
}
}
转换方法
- 8种包装类型中,有6种是数字型,继承来自java.lang.Number父类。
- java.lang.Number父类为所有子类分别提供了6个转型方法,将自身类型转换为其他数字型。
- parseXxx(String s)静态转型方法:7种包装类型都有,除了Character,都可以通过String进行构建。
//parseXxx静态方法(8种包装类型)
byte b3 = Byte.parseByte("123");//兼容类型
//byte b4 = Byte.parseByte("abc");
/*Exception in thread "main" java.lang.NumberFormatException*/
System.out.println(b3);
//System.out.println(b4);
- valueOf(基本类型)、valueOf(字符串类型),静态转型方式,8种包装类型都有。
Byte b1 = Byte.valueOf((byte)10);
Byte b2 = Byte.valueOf("20");
注意:在使用字符串构建包装类型对象时,要保证类型的兼容,否则产生NumberFormatException。
装箱、拆箱
- JDK5之后,提供自动装箱、拆箱,简化使用包装类的编程过程。
- 自动装箱,将基本类型直接赋值给包装类型。
- 自动拆箱,将包装类型的值,直接赋值给基本类型。
//JDK5以后,自动装箱,拆箱
Byte b4 =40; //将基本类型直接赋值给包装类型,调用valueOf
byte b5 = b4; //自动拆箱,将包装类型的值,直接赋值给基本类型,调用byteValue
整数缓冲区
- Java预先创建了256个常用的整数包装类型对象。
- 在实际应用当中,对已创建的对象进行复用。
自动装箱时,会调用valueOf方法,整数会提供对应缓冲区,将常用的256个数字提前创建对象并保存在数组中,实现复用,即在区间内复用已有对象,在区间外创建新对象。
public class TestCache {
public static void main(String[] args) {
//Byte、Short、Integer、Long 四种整数包装类型都提供了对应的cache缓冲区,提前创建了256个常用对象
//缓冲
Short s1 = 100;//调用valueOf(100),进行区间的判断(-128~127),满足区间条件,将一个数组中的Short对象进行返回
Short s2 = 100;
Short s3 = 200;
Short s4 = 200;
System.out.println(s1 == s2);//true
System.out.println(s3 == s4);//false
System.out.println(s1.equals(s2));//true//判断内容,覆盖了父类的Object equals(this == obj)
System.out.println(s3.equals(s4));//true
}
}