java中的包装类

Java是面向对象编程的,但是对于基本数据类型确实没有对象的,这就会发生矛盾,所以就有了包装类

byte --------------> Byte
short --------------> Short
int --------------> Integer
long --------------> Long
char --------------> Character
float --------------> Float
double --------------> Double
boolean --------------> Boolean

包装类的自动拆装箱:即基本数据类型与对应的包装类可以直接对应

Integer b=10;  //在编译时,jvm会将其转换为Integer b = Integer.valueof(10),这便是自动装箱,即基本数据类型转换为包装类型
int a = b;	//自动拆箱
128陷阱,看下例
Integer num1=100;
Integer num2=100;
System.out.println(num1 == num2);   //true

Integer num3=128;
Integer num4=128;
System.out.println(num3 == num4);	//false

原因:因为Integer在编译时,会变为 Integer.valueof(),我们看该方法的原码,会发现其是用一个cache数组来存储数据的,如下:

而关于cache数组,我们查看其原码,

发现其大小是-128~127,也就是说,当Integer的值是出于-128~127之间时,会直接使用cache数组中已经存储好的值,再看valueof的原码,当数据是在这个范围外时,就会在堆内存中新开辟一个Integer的空间,所以此时num3==num4的值为false

我们可以通过一些小练习来更好的掌握

public static void main(String[] args) {
        int a = 10;
        int b = 10;
        Integer a1 = 10;
        Integer b1 = 10;
        Integer a2 = new Integer(10);
        Integer b2 = new Integer( 10);
        System.out.println(a == b);		//true
        System.out.println(a1==b1);		//true,Integer的值在-128~127之间,所以此时用的是cache数组中的值,所以true
        System.out.println(a2== b2);	//false,a2和b2都是新开辟的Integer对象,所以地址不同,所以false
        System.out.println(a1 == a);	//true,当包装类用==与基本数据类型比较时,会自动拆箱	
        System.out.println(a1.equals(a));	//true,此时会自动装箱,与上一个情况类似
        System.out.println(a1 == a2);	//false,地址不同,a2是新开辟的,a1是cache数组中的
        System.out.println(a == a2);	//自动拆箱
    }

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值