Java中的包装类

  1. 概述
  2. 装箱与拆箱
  3. 自动装箱与自动拆箱
  4. 其他包装类缓存范围

概述

Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而在实际使用时将存在很多的不便,很多地方都需要使用对象而不是基本数据类型。
比如,在集合类中,我们是无法将int 、double等类型放进去的,因为集合的容器要求元素是Object类型。而包装类型的存在使得向集合中传入数值成为可能,包装类的存在弥补了基本数据类型的不足。

此外,包装类还为基本类型添加了属性和方法,丰富了基本类型的操作。如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下:

基本类型 对应的包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

装箱与拆箱

基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱“:

  • 装箱:从基本类型转换为对应的包装类对象。

  • 拆箱:从包装类对象转换为对应的基本类型。

用Integer与 int为例:

基本数值—->包装对象

Integer i = new Integer(4);//使用构造函数函数
Integer i1 = Integer.valueOf(4);//使用包装类中的valueOf方法

包装对象—->基本数值

int num = i.intValue();//i是之前创建的Integer对象

自动装箱与自动拆箱

从Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。

Integer i = 4;  //自动装箱。相当于Integer i = Integer.valueOf(4);
i = i + 5;      //等号右边:将i对象转成基本数值(自动拆箱) i.intValue() + 5;
                //加法运算完成后,再次装箱,把基本数值转成对象。

实现代码:

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)        //判断参数范围
            return IntegerCache.cache[i + (-IntegerCache.low)];     //如果参数在范围内,返回一个在数组中的对应的Integer对象(cache是一个Integer数组,存储着值为-128~127的Integer对象)
        return new Integer(i);                                      //不在范围内则对用构造方法新建并返回Integer对象
    }

源代码及其注释:

IntegerCache.cache[]数组源代码:


其他包装类缓存范围

类型 相同对象范围
Integer [-128,127]
Short [-128,127]
Character c<=127
Long [-128,127]

Double、Float的valueOf方法的实现,每次都返回不同的对象。

  • 比较两个包装类型数值大小要使用equals方法
  • 拆箱操作时一定要特别注意封装类对象是否为null,拆箱调用了intValue()方法,若对象为空,即null.intValue,运行时会抛出空指针异常

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1401362462@qq.com

文章标题:Java中的包装类

字数:690

本文作者:百xiao生

发布时间:2020-11-13, 17:03:11

最后更新:2020-12-07, 15:08:54

原始链接:https://baixiaoshengzjj.top/2020/11/13/Java%E4%B8%AD%E7%9A%84%E5%8C%85%E8%A3%85%E7%B1%BB/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。