java.lang包—基本类型的封装类

目录

一、java为什么需要对各种类型提供封装类?

二、8大基础类型和对应的封装类型

三、基础类型与封装类的区别

四、"=="和"equal()"方法

五、Integer.valueOf函数

六、常见面试题

总结


一、java为什么需要对各种类型提供封装类?

在刚刚学习java的时候,老师不止一次的说过java是一种面向对象的语言,万物皆对象。对于java中的基础数据类型,由于为了符合java中面向对象的特点,同样也有其封装类。这篇文章对其有一个认识。

二、8大基础类型和对应的封装类型

其实在jdk1.5之前,在基础数据类型与其封装器之间的转化必须手动进行,但是从jdk1.5之后,由于提供了自动装箱的机制,因此我们不再手动进行了。

  • 装箱:基础类型转封装类型。Integer a = 3底层实现:Integer a = Integer.valueOf(3);   //装箱这个过程是通过Integer.valueOf这个函数完成的,隐士装箱也是调用这个函数,这个知识点很重要
  • 拆箱:封装类型转基础类型。int b = a;底层实现:int b = a.intValue();

既然封装类能够封装基础类型,那么能封装的范围是多少呢?我们对其进行了一个总结。不过我们应该注意到boolean类型没有给出精确的定义,可能是一个字节也有可能是四个字节,这是为什么呢?java虚拟机规范中规定的是4个字节,但是不同的厂家虚拟机可能不同,所以可能不会按照规范来。

  • Java中的数值都是有符号的,不存在无符号的数,它们的取值范围也是固定的,不会随着硬件环境或者操作系统的改变而改变。
  • Java语言中,默认声明的小数是double类型的,因此对float类型的变量进行初始化时需要进行类型转换。float类型变量有两种初始化方法:float f = 1.0f  或者 float f =(float) 1.0 

三、基础类型与封装类的区别

1、传递方式不同

基本类型是按值传递,而封装类型是按引用传递的。int是基本类型,直接存放数值;Integer类会产生一个对象引用指向这个对象。

2、存储位置不同

基本类型存储在栈中,封装类的引用存储在栈中,而值是存在堆中。这样看上去好像基础封装类多此一举,而且基本类型的速度也确实会比封装类更快。为什么快呢?这是因为封装类涉及到了对象内存的分配和垃圾回收。但是基本类型直接拿起来就计算了

四、"=="和"equal()"方法

 比较方法 
基本型和基本型比较基本型 == 基本型 
基本型和基本型的封装型比较

基本型 == 封装型

将封装型拆箱 

封装型.equals(基本型)将基本型装箱
封装型与封装型比较封装型 == 封装型 
封装型.equals(封装型) 

1)基本型 == 封装型:封装型自动拆箱为基本型后进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true。代码如下

int i=0;
Integer j=new Integer(0);
System.out.println(i==j);   //Integer(0)会自动拆箱为int类型再进行比较,显然返回true
System.out.println(i.equals(j));   //运行结果:true

2)封装型.equals(基本型):基本型封装类型调用equals(),但是参数是基本类型,这时候,先将基本型自动装箱,在对封装型进行比较。 

double d=0.5;
Double b=new Double(0.5);
System.out.println(d==b);   //运行结果:true
System.out.println(b.equals(d));   //运行结果:true

3)封装型.equals(封装型):两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true。

五、Integer.valueOf函数

面试题中经常出现下面这种代码的分析。今天我们来看看这个问题。

Integer aa=-100;
Integer bb=-100;
System.out.println(aa==bb);   //运行结果:true

Integer aaa=129;
Integer bbb=129;
System.out.println(aaa==bbb);   //运行结果:false

代码分析:Integer aa=-100;这句代码调用 Integer.valueOf()函数 进行装箱,来看下Integer.valueOf()函数

public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

 

可以看到调用valueOf()时,如果值在-128和127之间,则会先去缓存中去取,否则才会创建新的对象,再来IntegerCache()

private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];
 
    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            int i = parseInt(integerCacheHighPropValue);
            i = Math.max(i, 127);
            // Maximum array size is Integer.MAX_VALUE
            h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
        }
        high = h;
 
        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);
    }

    private IntegerCache() {}
}

缓冲池cache[ ]

以 Integer x = Integer.valueOf(123); 为例,首先先判断缓冲池中是否有当前数据,有就从InegerCache的缓存cache[] 数组中取出并返回, 在 VM 初始化期间, 缓存最大值 high, 可能被保存在 sun.misc.VM class 的私有系统属性里。不同包装类的 cache[] 范围不同。一些基本数据类型缓冲池的范围

  • boolean values true and false
  • short values between -128 and 127
  • int values between -128 and 127
  • char in the range \u0000 to \u007F
  • #进入对应类源码查看对应XXXCache类的cache范围即可

总结:

  • 基本型比较使用“==”,封装型比较使用equals(),不要混用!!!!
  • 对封装型进行赋值时,不要通过基本型去复制!!!!

六、常见面试题

Integer integer1=new Integer(100);
Integer integer2=new Integer(100);
System.out.println(integer1==integer2);

Integer integer3=100;//实际是Integer。Valueof(1000)
Integer integer4=100;//实际是Integer。Valueof(1000)
System.out.println(integer3==integer4);

Integer integer5=1000;//实际是Integer。Valueof(1000)
Integer integer6=1000;//实际是Integer。Valueof(1000)
System.out.println(integer5==integer6);

输出结果:

  • false:new在堆中开辟空间 1与2的地址不同,而==仅对地址进行比较,如果使用System.out.println(integer1.equals(integer2));则输出结果为true,因为equals()函数对值进行比较
  • true:100 自动装箱在Integer的缓冲区中,直接返回缓冲区对象,地址相同,为true
  • false:1000已经超出缓冲区了,会分配新的地址,所以使用==进行比较时结果false

总结

以上所述是小编给大家介绍的Java 八种基本类型和基本类型封装类,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

读后有收获可以支付宝请作者喝奶茶 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值