大纲:
- 包装类简介
- 创建包装类
- 自动装箱、拆箱
- 判断相等
- 默认值
- 其他
一、包装类简介
- Java中共有八种基本类型,byte, short, int, long, float, double, char, boolean。
- 分别对应八种包装类,Byte, Short, Integer, Long,Float, Double, Character, Boolean。
- 相较于基础数据类型,包装类有许多方法和成员变量供我们使用。
- 每个包装类型都有一个名为value的成员变量,用来存储它自己基本类型的值。
Integer a = new Integer(1);//包装类 int b = 1;//基础类型
二、创建包装类型
以Integer为例子,其他包装类类似
//通过基本类型创建 new Integer(1); Integer.valueOf(1); //通过字符串创建 new Integer("1"); //调用parseInt Integer.valueOf("1"); //调用parseInt Integer.parseInt("1");
几种常见创建方式,其他包装类也有类似的创建方法。
值得注意的是valueOf方法
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
可以发现使用了缓存,看下这个IntegerCache,它是Integer的嵌套类
private static class IntegerCache { static final int low = -128; static final int high = 127;//默认127,可配置 static final Integer cache[]; static { //将-128至127的包装类缓存到cache中 } }
也就是说使用valueOf()来创建值为-128至127的包装类时,会使用已经创建好的缓存。我们创建包装类尽量使用这个方法避免重复创建对象。
还有一点需要注意的是,有2个包装类(Float, Double)是不使用缓存的
三、自动装箱、拆箱
Integer a = 1; //自动装箱,反编译后发现使用Integer.valueOf(1)方法 int b = a; //自动拆箱,反编译后发现使用a.intValue()方法
java1.5以后,编译器会帮助我们完成自动装箱拆箱、不需要我们手动转换。
四、判断相等
//基础类型判断相等直接用==判断即可 //包装类型判断相等用equals,通过源码可知,比较的是两个包装类的基础类型的value值。
//基础类型和包装类型比较 int a = 1; Integer b = 1; System.out.println(a==b);//true,这里b会被自动拆箱 //包装类用==比较 Integer c = 1; Integer d = 1; System.out.println(c==d); //true,包装类自动装箱使用的是valueOf()方法,使用的是缓存 Integer e = 200; Integer f = 200; System.out.println(c==d); //false,这里由于200>127没有使用缓存,使用的都是new Integer()
五、默认值
包装类没有默认值,基础数据类型有初始化默认值。
private static int a; private static Integer b; public static void main(String[] args) { System.out.println(a);//0 System.out.println(b);//null }
使用的时候需要注意与数据库打交道的po对象尽量使用包装类,因为数据库查询结果为null时,使用基础数据类型会被赋上默认值。
六、其他
- 泛型只能使用包装类。
- 计算的时候避免基础类型与包装类直接运算(Long+long 一个包装类与基础类型直接加法运算),会导致自动拆装箱,影响性能。