Java —— 初识包装类

Java —— 初识包装类

在这里插入图片描述


每博一文案

 蔡康永曾经这样描述幸福感,我对于幸福感的一个重要的标准是,我可不可以
常常对很多不喜欢的事情说不,是一件非常幸福的事情,是因为你不用强迫自己掉入
一个泥沼中,无法脱身。人生就像一个收纳盒,有些东西渴望装进囊中,却始终得不到。
有些东西不想要,却又不得不接受,总是有诸多遗憾。
一路走来,我们总是带着太多的委屈,而最让自己深陷在对过去的叹息中的,莫过于
这两件事,亏欠了真正对你好的人,和愧对了,陪伴你醉酒的自己,听过这样一句话,
只有会珍爱自己的人,才更懂得爱人,我们活在这个世上,不能讨所有人欢喜,也
不能事事都完美。
                                             ——————    一禅心灵庙语



包装类

基本数据类型就是操作字面值,简单明了。在基本数据类型的字面值基础上,加入一些基础,方法,构造器,将基本数据类型封装为一个类,这个类就是包装类,基本数据类型有 8 种,对应的包装类也是为 8 种,如下表

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

从表上看,我们可以注意到 除了 char 、int其他的包装类都是对应类型的大写字母 ,所以我们只需要特别记住 int ——> Integer、char ——> Character就可以了.其中的包装类基本上都是在 java.lang包 下的,不需要导入包,可以直接使用.包装类主要用于在泛型上,想要了解泛型,大家可以移步到🔜🔜🔜 Java —— 初始泛型

这些包装类,都是被 final 修饰的是无法被继承的

public final class Float extends Number implements Comparable<Float> { }
    
public final class Boolean implements java.io.Serializable,
                                      Comparable<Boolean> { }

包装类的 "装箱(boxing)“和"拆箱(unboxing)”


/**
 * 包装类
 */
public class Blog14 {
    /*
    包装类的装箱,拆箱
     */
    public static void main(String[] args) {
        int i = 10;

        // 装箱操作,新建一个Integer类型对象,将i的值放入对象的某个属性中
        Integer ii = Integer.valueOf(i);   // 第一种方式,调用装方法
        Integer ij = new Integer(i);       // 第二种方式,调用构造方法

        // 拆箱操作,将Integer对象中的值取出,放到一个基本数据类型中,通过调用方法
        int n = ij.intValue();
        System.out.println(n);
        double d = ii.doubleValue();
        System.out.println(d);
    }

}

在这里插入图片描述


装箱/装包: 将基本数据类型包装为— > 包装类类型

拆箱/装箱: 将包装类型 — > 基本数据类型

自动装箱(outoboxing) 和 自动拆箱 (outounboxing)

可以看到在使用过程中,装箱和拆箱带来不少的代码量,所以为了减少开发者的负担,Java提供了自动机制

public class Blog14 {
    /*
    包装类的自动装箱,拆箱机制
     */
    public static void main(String[] args) {
        Integer num = 10;     // 自动装箱
        int n = num;          // 自动拆箱
        double d = num;       // 自动给拆箱
      System.out.println(n);
      System.out.println(num);
    }
}

并不是所有基本类型之间都是可以自动相互转换的,需要符号类型之间转换的规则: 小类型可以转为大类型,大类型无法转为小类型,具体细节大家可以参考🔜🔜🔜 Java类型转换(注意事项)_ChinaRainbowSea的博客-CSDN博客,不行的调用对应的方法,

public class Blog14 {
    /*
    包装类的自动装箱,拆箱机制
     */
    public static void main(String[] args) {
        Integer num = 10;
        char c = num;
    }
}

在这里插入图片描述


还可以通过包装类获取对应基本数据类型的最大值,和最小值

public class Blog14 {
    public static void main(String[] args) {
        Integer n = 10;
        System.out.println("该基本类型的最大值: "+n.MAX_VALUE);
        System.out.println("该基本类型的最小值: "+n.MIN_VALUE);
    }
}

在这里插入图片描述


大家再来看一道有关的面试题

public class Blog14 {
    public static void main(String[] args) {
        Integer a = 200;
        Integer b = 200;
        System.out.println(a == b);
        
        Integer c = 128;
        Integer d = 128;
        System.out.println( c == d);
        
        Integer f = 127;
        Integer g = 127;
        System.out.println( f == g);
    }
}

在这里插入图片描述


解析

为什么会出现这样的情况呢,一会相等,一会又不相等呢

我们先从源码上出发:

  public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
    private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];
                int j = low;
        for(int k = 0; k < cache.length; k++)
             cache[k] = new Integer(j++);
        // range [-128, 127] must be interned (JLS7 5.1.7)
        assert IntegerCache.high >= 127;

从源码上我们可以到 low 是为 -128high 是为 127 ,我们单独阅读

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

可以发现, 当 i >= -128 && i <= 127 的时候,在该范围内,每次的取值是在IntegerCache.cache[] 数组中取的数值的,在该范围内取的数值的来源是相同的,自然也就是会相等的,但是当,需要取的值是超出该范围的时候,是return new Integer(i); 通过 new 了一个对象出来,而在引用类型中的 == 等号,比较的就并不是数值了,而是其引用对象的地址,所以超过该范围的取值,比较时是地址,不是数值,结果就可能不相等了。


最后:

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,江湖再见,后会有期!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值