Java的基本数据类型的包装器

Java的基本数据类型

经过一次面试,了解到了Int与Integer的对比,因此研究了一下八大基本数据类型的源码,但也不是很深入的研究:
在基本数据类型中,每个数据类型都有与之相对应的包装器,如:Byte、Short、Integer、Long、Character、Double、Float、Boolean。
在Byte、Short、Integer、Long、Character这些封装中,如果直接给这5个数据类型进行赋值,如:Integer i = 50;这并不会产生一个新的对象,这是因为在这5中数据类型中,会将-128~127这一范围的数据创建好对象,并缓存起来,所以直接进行赋值时,如果在此范围内,则是从缓存中取出这个值赋给指定的变量,既是说只要不超过范围得到的值是已经创建好存在缓存中,如果超过范围的值,则是重新创建的新的对象值;由于这个特性,则会衍生出下列的问题,接下来以Integer为例说明:
如果int的与Integer进行比较,那么Integer会自行拆箱,然后就行对比:

        int a = 1000;
        System.out.println(a == new Integer(1000));

因为Integer会自行拆箱与int进行对比,所以输出的结果给:true。
那么Integer与Integer之间进行比较会如何呢?两者比较会产生下列的效果,先以赋值为例,如:

    Integer i = 50;
    Integer j = 50;
    System.out.println(i == j);

因为i与j的值在-128~127的范围内,则是从缓存中直接获取到50的值,将值分别赋给了i与j,因此输出的结果为:true。
如果将上述例子修改为下面这样子得到的结果将为false,因为超过了封装时所缓存的范围值,则需要new出一个新的Integer值,所以输出的结果即为:false。

    Integer i = 1000;
    Integer j = 1000;
    System.out.println(i == j);

那么除了这些常规的赋值方式,还有一种new Integer进行赋值的方式,如果这样赋值的话,会发生什么呢?

    Integer i = new Integer(55);
    Integer j = new Integer(55);
    System.out.println(i == j);
    Integer a = new Integer(1000);
    Integer b = new Integer(1000);
    System.out.println(a == b);

运行后可得到这两个输出的结果均为:false,这是因为通过了new去创建并赋值,也即是说,通过这个方式相当于给系统说,我不需要你提供在缓存中创建好的值,我想自己创建并赋值,所以创建好并赋值后,两者并不是同一个对象了,那么不同的对象用==进行对比,那么得到的结果只能是false。
最后一种情况,new Integer与Integer的对比,这两种对比的区别在于,前者会创建对象,存储在堆中,而后者因为在-128到127的范围内,不会创建新的对象,而是从IntegerCache中获取的。

    Integer i = 55;
    Integer j = new Integer(55);
    System.out.println(i == j);

通过上述的测试,可以得到最终输出的结果为:false。

综上所述,可以通过数据类型源码中知道,Byte、Short、Integer、Long、Character这5中数据类型会将-128~127这个区间的值创建好并放入到缓存中,用于提升性能和节省内存。所以这个范围内的自动装箱[相当于调用valueOf(int i)方法]的数字都会从缓存中获取,返回同一个数字。
顺带提一下八个类型所占的字节大小:byte占1个、short占2个,int占4个、long占8个、float占4个、double占8个,char占2个、boolean所占字节没有明确指定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值