包装类
java中的基本数据类型,如int,double等不是对象,无法通过向上转型获取到Object提供的方法,而像String却可以,只因为String是一个对象。基本数据类型由于这样的特性,导致无法参与转型,泛型,反射等过程。为了弥补这个缺陷,java提供了包装类。
基本数据类型 | 包装类 |
int | Integer |
short | Short |
long | Long |
double | Double |
float | Float |
char | Character |
boolean | Boolean |
byte | Byte |
自动装箱与拆箱
-
装箱 : 把一个基本数据类型的数据赋值给一个其对应的包装类的过程
- 拆箱 : 把一个包装类对象赋值给一个其对应的基本数据类型的变量的过程
1.以int -- Integer为例
装箱 Integer i1 = new Integer(123);
拆箱 int i2 = i1.intValue();
2.从jdk5开始支持自动装箱 拆箱的
(1)原来接数据类型限定了变量可以存值的类型int i = 10;可以 int k = 3.0;不可以
(2)多态:父类类型兼容子类类型类型:Animal aml = new Person();
手动装箱:int i2 = new Integer(123);//通过方法装箱
自动装箱: Integer i1 = 123;//包装类Java提供特性,基本数据类型装入到包装类对象
3.自动装箱拆箱只支持 基本数据类型和其对应的包装类
double d = 123;//自动类型类型转换
Integer i = 123;//自动装修
Double dd = 123.0;//自动装箱
Double ddd = 123; //报错,左边类型Double ,右边123是int类型
享元模式
使用自动装箱创建Integer对象时,如果值是-128~127范围时,不会创建新的Integer对象,直接从数组中取出该元素(元素就是Integer对象),如果不是-128~127范围,则是使用new Integer的方式创建一个新的Integer对象,在加载Integer类信息时,会使用静态代码块自动的创建一个数组,数组中自动的创建了256个Integer元素:-128~127范围的Integer对象(即使缓存了-128-127范围内的数,如果需要使用范围内的数就直接引用)
public static void main(String[] args) {
//自动装箱
Integer i1 = 10;
Integer i2 = 10;
//地址值比较,证明时同一个对象
System.out.println(i1==i2);//true
//对象比较,比较里面内容
System.out.println(i1.equals(i2));//true
//创建一个新对象
Integer i3 = new Integer(10);//new 一定会复制一份
//不同,new一定会创出一个新对象
System.out.println(i1==i3);//false
System.out.println(i1.equals(i3));//true
//享元模式只缓存-128-127
Integer i4 = 500;
Integer i5 = 500;
System.out.println(i4==i5);//false
}