包装类----实现万物皆对象

 包装类的产生

java是由基本数据类型的,但是基本数据类型和java有一个冲突,java曾说过万物皆对象,但是int,float,char这些基本数据类型并不是对象,因此java决定不用基本数据类型,而是使用包装类

所以java对于每一个数据类型都设计了一个包装类

基本数据类型对应的包装类

包装类有什么用?

包装类的本质是一个类

public class Test {
    public static void main(String[] args) {
        int a=12;//int是基本数据类型,它只能定义数据在内存当中如何存储
        Integer a1=12;//是一个类,其中有很多方法可以使用,a1可以使用equals方法,而a只能使用==做判断
    }
}

 int a=12; 

 int是基本数据类型,它只能定义数据在内存当中如何存储
 Integer a1=12; 

Integer是一个类,其中有很多方法可以使用,a1可以使用equals方法,而a只能使用==做判断

128陷阱(面试经典题)

public class Test {
    public static void main(String[] args) {
        Integer a=12;
        Integer a1=12;//是引用数据类型,是一个类,其中有很多方法可以使用
        System.out.println(a==a1);//true
        //==比较的是地址
        Integer a2=1000;
        Integer a3=1000;//是引用数据类型,是一个类,其中有很多方法可以使用
        System.out.println(a2==a3);//false
    }
}

执行结果

分析程序执行:

定义的参数Integer a=10,通过编译和反编译,我们会发现在编译过程当中,会将Integer a=10编译为Integer.valueOf(10)

Integer.valueOf方法如下

我们发现当定义的数据不在一个区间范围之内时,会返回一个值,超出区间范围,则会开辟一个新的内存空间(这会导致地址值不同)

通过查看源代码,我们可以发现区间值为[-128,127]

区间为一个长度为256(-128~127)的区间,256个数字最终存储cache数组当中

如果超出区间范围,则会新开辟一块内存空间

执行结果

128陷阱产生的原因

在Integer的valueOf()方法当中,我们将数值在-128~127之间的数值都存储在一个cache数组当中,该数组相当于一个缓存,数据-128~127之间直接返回该数据在数组当中的地址值,所以在-128~127之间的数值用==进行比较是相等的    true

而不在这个区间的数,需要新开辟一个内存空间,所以不相等。false

自动拆装箱(经典问题)

 Integer a=10;// Integer a = Integer.valueOf(10);自动装箱
 int b=a;//int a = b.intValue();自动拆箱
自动装箱

将基本数据类型自动转换为对应的包装类对象的过程。

自动拆箱

将包装类对象自动转换为对应的基本数据类型的过程。

例题
 public class Test {
    ///自动拆装箱
        public static void main(String[] args) {
//            Integer a=10;// Integer a = Integer.valueOf(10);自动装箱
//            int b=a;//int a = b.intValue();自动拆箱
              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("1.**********");
            System.out.println(a==b);//基本数据类型,比较值是否相等
            System.out.println("2.**********");
            System.out.println(a1==b1);//引用数据类型,比较地址值是否相同,指向数组中的相同数据
            System.out.println("3.**********");
            System.out.println(a2==b2);//新开辟内存空间,地址值不同
            System.out.println("4.**********");
            System.out.println(a1==a);//包装类和基本数据类型通过==进行比较,包装类会自动拆箱,比较直是否相同
            System.out.println("5.**********");
            System.out.println(a1.equals(a));//包装类和基本数据类型通过equals进行比较会自动拆箱
            System.out.println("6.**********");
            System.out.println(a1==a2);//地址值不同
            System.out.println("7.**********");
            System.out.println(a==a2);//自动拆箱
        }
    }
    //

1.**********

true a b都是基本数据类型,==比较值是否相等

2.**********

true a1 b1都是引用数据类型,==比较地址值是否相同,指向数组中的相同数据

3.**********

false a2 b2创建时都新开辟内存空间,地址值不同

4.**********

true 包装类和基本数据类型通过==进行比较时,a1会自动拆箱

5.**********

true 包装类和基本数据类型通过equals进行比较时,a1会自动拆箱

6.**********

false 地址值不同

7.**********

true 包装类和基本数据类型通过==进行比较时,a2会自动拆箱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值