前言:
Java是一个面向对象的语言,而Java中的基本数据类型不是面向对象的,这在实际使用时存在很多不便。比如:我们在使用带有泛型的类时,如果你把int放到泛型中会提示出错。需要将基本类型转成包装类型。
包装类型:
就是把基本类型进行包装成一个对象,在英文中就是boxing(装箱)的意思。在JavaSE5中,为了减少开发人员的工作,Java提供了自动拆箱与自动装箱的功能。自动装箱:将基本类型自动转成对应的包装类。自动拆箱:将包装类自动转换成对应的基本数据类型。
使用注意点:
虽然包装类自动装箱和拆箱很方便,但当我们拿到一个包装类对象去做运算或判断时,是需要去校验当前包装对象是否为null。如果你用为null的对象去和其他基本数据类型去做运算就会报错NPE,同理,你用null去做判断大小或者其他逻辑也是会报错的。
缓存:
当程序自动装箱时会调用valueOf方法。
可以看到代码中Integer类会有一个IntegerCache缓存类,类中有一个数组,数组中的值默认大小范围是在 -128~127。如果当前传入的值是在这个范围内,那么就不会去new Integer的。网上虽然说当一个Integer的对象值是在这个范围时,是可以直接用== 来比较的,但是现在在编译是用== 来比较2个包装类型是会提示错误的
所以我们最好还是用equals去判断是否相等。
扩展:
阿里规范手册中也有对包装类使用有一些说明,大概就是,int 类型不能接收数据库中可能查出来的null。PRC接口中的返回内容中null也是具有一定的业务逻辑意义,可能就是程序出错直接返回null,我们也能第一时间观察到null值并做出处理。NPE的操作都是有使用者来保证的,而不能是程序的默认处理。