Java中有两大数据类型:基本数据类型和引用数据类型。
java
8大基本数据类型都有包装类。包装类是一个类,有方法属性构造器
包装类Integer就像String和Math同样是一个类,有方法属性构造器web
包装类是一个JDK自带的类,因此能够在JDK API离线文档中查看到。下面是JDK API下载连接和JDK API Documentation 教程使用详解。
推荐学会JDK API的查看。svg
JDK API下载连接:传送门
JDK API Documentation 教程使用详解连接:JDK API Documentation 教程使用详解大数据
编码过程当中只接收对象的状况,好比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来实现,具体以下。spa
public static void main(String[] args) { // 这是一个字符串 String numStr = "123"; // 字符串转换成包装类 Integer num01 = Integer.valueOf(numStr); // 包装类型向基本数据类型转换(拆箱) int num = num01; System.out.println(num); }
jdk1.5之后,装箱和拆箱都是自动完成(自动拆箱装箱),可是有的时候仍是须要咱们手动进行拆装箱。.net
装箱:由基本数据类型向包装类型转换3d
// 装箱:将基本数据类型转换成引用类型 int i = 11; Integer integer = new Integer(i); // 手动写代码装箱 System.out.println(integer); // 自动装箱 Integer integer2 = 11; System.out.println(integer2);
拆箱:由包装类型向基本数据类型转换code
// 拆箱:由包装类型向基本数据类型转换 Integer integer3 = new Integer(33); int i3 = integer3.intValue(); // 手动写代码拆箱 System.out.println(i3); // 自动拆箱 int i4 = new Integer(44); System.out.println(i4);
包装类之间不可用==来比较是否相等,须要比较字面值是否相等则须要使用Integer包装类的equals()方法!xml
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 }
现象: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()方法: