包装类型(java)

本文讲解了Java中的基本数据类型与引用类型的区别,重点介绍了基本类型包装类(如Integer、Boolean等)的用法、自动装箱拆箱原理,以及不变类特性。学习如何通过Integer.valueOf()进行类型转换,以及避免因不当使用导致的性能问题和空指针异常。
摘要由CSDN通过智能技术生成

包装类型

1、Java数据类型:基本+引用

基本数据类型:byte,short,int,long , boolean , double , char

引用类型:所有class 和 interface 类型

注:引用类型可以赋值为null,表示空,但基本类型不能赋值为null

String str1 = null; (String是java中字符串类型,是一种引用类型)

int str2 = null; 错误,基本类型不能赋值为null

2、如何将一个基本类型视为对象呢

1、定义一个Integer类,其只包含一个实例字段int,该Integer类就可以视为int的包装类(Wrapper Class)

2、Integer类编译器核心库已经写好了,我们直接调用,我们可以把int和Integer互相转换

Integer n = null;
Integer n2 = new Integer(99);
int n3 = n2.intValue();

3、在日常开发中,包装类型非常有用,java核心库为每种基本类型都提供了对应的包装类型:

基本类型对应的引用类型
booleanjava.lang.Boolean
bytejava.lang.Byte
shortjava.lang.Short
intjava.lang.Integer
longjava.lang.Long
floatjava.lang.Float
doublejava.lang.Double
charjava.lang.Character

我们直接用就好,不用定义了

int i = 100;
        // 通过new操作符创建Integer实例(不推荐使用,会有编译警告):
        Integer n1 = new Integer(i);
        // 通过静态方法valueOf(int)创建Integer实例:
        Integer n2 = Integer.valueOf(i);
        // 通过静态方法valueOf(String)创建Integer实例:
        Integer n3 = Integer.valueOf("100");
        System.out.println(n3.intValue());

3、int 和 Integer 可以互相转换

1、Integer类中定义了很多方法,我不列举了,有兴趣的可以自己去看看

2、

        int i = 10;
        Integer n1 = Integer.valueOf(i);
        System.out.println(n1);

3、装箱和拆箱

1、自动装箱(Auto Boxing)和 自动拆箱(Auto Unboxing)

    Integer n = 100;    
    int x = n; 

int变为Integer的赋值写法,称为自动装箱

Integer变为int的赋值写法,称为自动拆箱

目的:为减少代码

2、装箱和拆箱会影响代码的执行效率,因为编译后的class代码是严格区分基本类型和引用类型的。并且,自动拆箱执行时可能会报空指针异常NullPointerException

4、不变类

1、通过查看Integer的源码可知,所有的包装类型都是不变类核心代码如下

2、对两个Integer实例进行比较要特别注意:绝对不能用==比较,因为Integer是引用类型,必须使用equals()比较:

详细解释:==比较,较小的两个相同的Integer返回true,较大的两个相同的Integer返回false,这是因为Integer是不变类,编译器把Integer x = 127;自动变为Integer x = Integer.valueOf(127);,为了节省内存,Integer.valueOf()对于较小的数,始终返回相同的实例,因此,==比较“恰好”为true,但我们绝不能因为Java标准库的Integer内部有缓存优化就用==比较,必须用equals()方法比较两个Integer

3、因为Integer.valueOf()可能始终返回同一个Integer实例,因此,在我们自己创建Integer的时候,以下两种方法:

  • 方法1:Integer n = new Integer(100);

  • 方法2:Integer n = Integer.valueOf(100);

方法2更好,因为方法1总是创建新的Integer实例,方法2把内部优化留给Integer的实现者去做,即使在当前版本没有优化,也有可能在下一个版本进行优化。

我们把能创建“新”对象的静态方法称为静态工厂方法。Integer.valueOf()就是静态工厂方法,它尽可能地返回缓存的实例以节省内存。

注:创建新对象时,优先选用静态工厂方法而不是new操作符。

4、Integer还提供了进制转换等大量方法

parseInt()方法就可以把字符串解析成一个整数,具体不多赘述了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值