包装类为什么要有包装类Java 里8 种基本数据类型byte/short/int/long/float/double/char/boolean不是对象不继承Object。但是集合、泛型只能存对象不能直接放基本类型所以 Java 为每个基本类型提供了对应的包装类把基本值包装成对象。大部分就是首字母大写只有两个特殊int → Integerchar → Character自动装箱 自动拆箱装箱基本类型 → 包装对象Integer a 10; // 自动装箱等价于 Integer a Integer.valueOf(10);拆箱包装对象 → 基本类型int b a; // 自动拆箱等价于 int b a.intValue();Integer 缓存池Integer.valueOf()会缓存-128 ~ 127的 Integer 对象这个区间内直接复用对象超出区间新建对象Integer i1 100; Integer i2 100; System.out.println(i1 i2); // true在缓存池里 Integer i3 200; Integer i4 200; System.out.println(i3 i4); // false超出缓存是两个不同对象包装类比较值优先用.equals()不要用包装类的常用作用放入泛型、集合ListInteger不能写Listint可以存null基本类型有默认值不能为 null自带很多工具方法字符串转数字、进制转换等int num Integer.parseInt(123); // 字符串转int String s Integer.toString(456); // 数字转字符串装箱拆箱装箱// 手动装箱 int i10; Integer iiInteger.valueOf(i)装箱把基本类型 int包装成 Integer 对象valueOf()优先从缓存池-128~127拿现成对象节省内存// 方式2new Integer(i) 【不推荐Java9已经废弃】每次都新建对象不走缓存 Integer ij new Integer(i);new Integer()强制创建新对象哪怕值在缓存区间也不复用拆箱// 拆箱 :从Integer对象里取出里面的int值 int jii.intValue();每个包装类都有对应的xxxValue()方法Integer→intValue()Double→doubleValue()Character→charValue()自动装箱、自动拆箱// 自动装箱 等价与 Integer aInteger.valueOf(10) Integer a10; // 自动拆箱等价于 int ba.intValue(); int ba;写起来更简洁编译之后本质还是上面的 valueOf() 和 intValue()自动装箱只是语法糖底层调用的就是 valueOf这也是缓存池生效的前提重点对比Integer i1100; // 自动装箱 --- valueOf(100) 缓存里拿 Integer i2100; System.out.println(i1i2); // true , 同一个缓存对象 Integer i3200; // 自动装箱---- valueOf(200) 超出缓存新建对象 Integer i4200; System.out.println(i3i4); // false 两个不同对象Integer 的缓存数组 cache 只预存了-128 ~ 127之间的对象。坑点a 比较的是对象地址b比较包装类的值一定要用 .equals()面试题Integer a127; Integer b127; Integer c128; Integer d128; System.out.println(ab); // true System.out.println(cd); // false // equals 比较数值不管是否在缓存区间 System.out.println(c.equals(d)); // true1Integer a 127; Integer b 127;a 这是自动装箱底层等价于Integer.valueOf(127)。b Java 的Integer内部有一个静态缓存IntegerCache默认缓存范围是-128 ~ 127。b 数字 127 落在缓存区间内valueOf直接返回缓存里同一个对象。d对引用类型比较的是对象内存地址a和b地址相同所以输出true。2Integer c 128;、Integer d 128;a128 超出了-128--127的缓存范围Integer.valueOf(128)会新建两个不同的 Integer 对象。bc和d是两个独立对象内存地址不一样判断地址不相等输出false。3补充a基本类型比值包装类引用类型比对象地址b比较包装类里面的数值大小要用 a.equals(b)System.out.println(c.equals(d)); // true比较内部数值泛型背景普通类 / 方法只能写死固定类型基本类型、自定义类想一套代码适配多种类型就很麻烦这就是泛型要解决的问题版本泛型是JDK1.5新增语法通俗理解泛型 适用于很多类型专业定义泛型本质是类型参数化把类型像参数一样传入让类、接口、方法可以在不修改源码的情况下支持多种不同类型泛型带来的好处编译期类型检查减少类型转换异常避免大量强制类型转换复用一套代码适配多种引用类型泛型不支持基本类型要用包装类Integer 代替 int