1.包装类
-
就是将基本数据类型进行包装,形成引用类型
-
包装类的出现是为什么呢?
- equals方法在和**==进行比较操作时,一再强调过只有相同类型才有比较**的意义
- 简单类型之间可以比较,引用数据类型之间也可以比较,那么简单类型和引用数据类型怎么比较呢
- 包装类:简单类型 -> 引用数据类型 转换的桥梁
-
8种简单类型对应的包装类型
简单类型 | 对应的包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
boolean | Boolean |
float | Float |
double | Double |
-
注意:int -> Integer char -> Character
-
所有的包装类都是java.lang包下的
-
用法
-
Integer 是引用数据类型
-
所以要以对象的形式存在 -> 通过 new + 构造器方式创建对象
-
Integer 提供的构造器主要是:
public Integer(int value) public Integer(String s) Integer i1 = new Integer(100); Integer i2 = new Integer("100"); System.out.println(i1 == i2);
-
通过提供的构造器传参创建对象,参数可以是整型数据,也可以是字符串数据
-
i1 == i2
比较的是两个对象是否指向同一个地址空间,结果肯定是false,因为 new 就是在堆中开拓内存,所以这两个的地址肯定是不一样的 -
注意:字符串数据,双引号中的也必须是同一类型(这里是整型数值),否则无法进行转换操作,比如
new Integer("abc")
这是没有办法进行转换的 -
Integer 对象的创建,还可以使用 API 中提供的静态方法
public static Integer valueOf(int i) public static Integer valueOf(String s) Integer i3 = Integer.valueOf(200); Integer i4 = Integer.valueOf("200"); System.out.println(i3 == i4);
-
通过静态方法 valueOf 获得 Integer 对象,
i3 == i4
同样比较的是两个对象是否指向同一个地址空间,结果还是 false -
以上两种方法,将整型或字符型数据 -> 包装类型数据 ,这种行为就称为装箱
-
现在 i1 和 i2 现在是 Integer 类型,属于引用数据类型,同样可以让他们转换成简单类型
public int intValue() int i5 = i1.intValue(); int i6 = i2.intValue(); System.out.println(i5 == i6);
-
调用 intValue()方法,是让 Integer 类型转换为 int 类型,那么
i5 == i6
比较的是 int 类型,所以结果肯定是true -
下面是我们非常常用的静态方法,可以将字符串转换成int类型
public static int parseInt(String s) int i7 = Integer.parseInt("200"); System.out.println(i6 == i7);
-
调用 parseInt() 方法让 String 类型转换为 int 类型数据,所以
i6 == i7
结果肯定为false -
以上两种类型,完成包装类型转换为简单类型,字符串类型转换为简单类型,这种行为为拆箱
-
-
简单类型 - > 包装类型 装箱 (显示完成)
-
包装类型 - > 简单类型 拆箱 (显示完成)
-
如果以上行为改为隐式完成,就称为自动装箱,自动拆箱
-
自动装箱
Integer i1 = 100; System.out.println(i1);
- 100是 int 类型数据,直接赋值给 Integer 类型变量 i1,并创建了随想,这就是自动装箱
- 打印 i1 其实就是 i1.toString(),包装类中的 toString()方法就是重写了 根父类中的 toString()方法
-
自动拆箱
int i2 = i1; System.out.println(i2);
- 将 Integer 类型变量 i1 赋值给 int 类型变量 i2 ,上面代码就是在完成自动拆箱
Integer i3 = 127; Integer i4 = 127; System.out.println(i3 == i4);
- Integer 类型有一个特殊性,如果是直接给 Integer 类型赋值,那么就会首先区常量池里面看看有没有这个值,如果有的话,就不用再申请内存,直接指向常量池的地址空间就可以了所以上面的题目,由于指向同一地址空间,所以结果为true,但是这个数值范围仅局限于byte类型的取值范围,即-128~127,超出部分就不会有一样的地址空间
-
当进行数值比较和计算的时候,可以自动拆箱进行处理操作
int i7 = 20; System.out.println(i7 < i3); System.out.println(i6 + 30);
- 其中 i7 是简单类型,而 i3 是引用数据类型,然而 i3 自动拆箱转换为 int 类型,和 i7 进行值的比较,所以结果为true
- i6 + 30语句,i6 自动拆箱为 int 类型进行计算操作