文章目录
一、Java数据类型:
Java中有两大数据类型:基本数据类型和引用数据类型。
二、Java包装类
1.概念
8大基本数据类型都有包装类。包装类是一个类,有方法属性构造器
包装类Integer就像String和Math一样是一个类,有方法属性构造器
- 基本数据类型对应的包装类(图表)
2.作用
编码过程中只接收对象的情况,比如ArrayList中泛型只能存入对象,不能存入基本数据类型。泛型的参数只能是对象,不能是原始数据类型;(请粘贴以下代码到编译器中,感受一下编译报错)
import java.util.ArrayList;
// 并不推荐使用中文做类名,我这里只是为了演示方面
public class 包装类 {
public static void main(String[] args) {
// 下面才是正确的
ArrayList<Integer> list2 = new ArrayList<>();
// 下面这句在编译期就会报错,因为泛型<>括号中不能是基本数据类型,如果要用需要是包装类
ArrayList<int> list = new ArrayList<>();
}
}
方便类型之间的转换,比如String和int之间的转换可以通过int的包装类Integer来实现,具体如下。
public static void main(String[] args) {
// 这是一个字符串
String numStr = "123";
// 字符串转换成包装类
Integer num01 = Integer.valueOf(numStr);
// 包装类型向基本数据类型转换(拆箱)
int num = num01;
System.out.println(num);
}
3.文档中查看
包装类是一个JDK自带的类,所以可以在JDK API离线文档中查看到。下面是JDK API下载链接和JDK API Documentation 教程使用详解。
推荐学会JDK API的查看。
JDK API下载链接:传送门
JDK API Documentation 教程使用详解链接:JDK API Documentation 教程使用详解
4.包装类的装箱拆箱(Integer举例)
jdk1.5以后,装箱和拆箱都是自动完成(自动拆箱装箱),但是有的时候还是需要我们手动进行拆装箱。
装箱:由基本数据类型向包装类型转换
// 装箱:将基本数据类型转换成引用类型
int i = 11;
Integer integer = new Integer(i); // 手动写代码装箱
System.out.println(integer);
// 自动装箱
Integer integer2 = 11;
System.out.println(integer2);
拆箱:由包装类型向基本数据类型转换
// 拆箱:由包装类型向基本数据类型转换
Integer integer3 = new Integer(33);
int i3 = integer3.intValue(); // 手动写代码拆箱
System.out.println(i3);
// 自动拆箱
int i4 = new Integer(44);
System.out.println(i4);
5.注意点
1.包装类型的比较相等问题(Integer举例)
包装类之间不可用==来比较是否相等,需要比较字面值是否相等则需要使用Integer包装类的equals()方法!
public static void main(String[] args) {
Integer num01 = new Integer(99); // 创建num01对象
Integer num02 = new Integer(99); // 创建num02对象
// 下面输出false的原因:包装Integer是在堆中创建了2个对象,而==比较的是内存地址,两个对象的内存地址并不一样,所以false
System.out.println(num01 == num02); // false
// 下面输出true的原因:和String类的equals()方法一样,比较的是字面值是否相等,所以返回true
System.out.println(num01.equals(num02)); // ture
}
2.Integer自动装箱值范围问题
现象:Integer自动装箱时,当值在范围[-128, 127]之间时,使用==号比较内存地址将会返回true,而超过此范围时返回false。
public static void main(String[] args) {
// Integer自动装箱底层调用的是valueof()方法。in2和in3的自动装箱同下面这句一样
Integer in = Integer.valueOf(0);
// [-128, 127]范围内,源码并未创建对象,所以返回true
Integer in2 = 127;
Integer in3 = 127;
System.out.println(in2 == in3); // true
Integer in4 = -128;
Integer in5 = -128;
System.out.println(in4 == in5); // true
// 超过了范围[-128, 127]创建新的Integer对象,in6和in7是不同对象,==比较时是不同地址,所以返回false
Integer in6 = 233;
Integer in7 = 233;
System.out.println(in6 == in7); // false
}
原因:因为Integer自动装箱底层调用的是valueof()方法。而valueof()方法在区间[-128, 127]时并不会创建对象,而是在Integer的缓冲cache中拿。当超过了范围[-128, 127]时,则会创建新的Integer对象
valueOf()方法: