标签:color lse 完成 嵌套类 java包 ble equal 编译 ring
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时,使用基础数据类型会被赋上默认值。
标签:color lse 完成 嵌套类 java包 ble equal 编译 ring
原文地址:https://www.cnblogs.com/liuboyuan/p/11868613.html