常用类一(包装类)

目录

基本数据类型的包装类

包装类基本知识

包装类的用途

自动装箱和拆箱

自动装箱:

自动拆箱:

包装类的缓存问题


基本数据类型的包装类

        八种基本数据类型并不是对象,为了将基本类型数据和对象之间实现互 相转化,JDK 为每一个基本数据类型ᨀ供了相应的包装类。

包装类基本知识

        Java 是面向对象的语言,但并不是“纯面向对象”的,因为我们经常用到的基本数据类 型就不是对象。但是我们在实际应用中经常需要将基本数据转化成对象,以便于操作。比 如:将基本数据类型存储到 Object[ ]数组或集合中的操作等等。

        为了解决这个不足,Java 在设计类时为每个基本数据类型设计了一个对应的类进行代 表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。

        包装类均位于 java.lang 包,八种包装类和基本数据类型的对应关系如下

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

        在这八个类名中,除了 Integer 和 Character 类以外,其它六个类的类名和基本数据类 型一致,只是类名的第一个字母大写而已。

        在这八个类中,除了 Character 和 Boolean 以外,其他的都是“数字型”,“数字型”都是 java.lang.Number 的子类。Number 类是抽象类,因此它的抽象方法,所有子类都需要ᨀ供 实现。Number 类提供了抽象方法:intValue()、longValue()、floatValue()、doubleValue(), 意味着所有的“数字型”包装类都可以互相转型。

Number的子类:

Number的抽象方法:

包装类:

public class WrapperClassTest {
    public static void main(String[ ] args) {
        Integer i = new Integer(10);
        Integer j = new Integer(50);
    }
}

包装类的用途

对于包装类来说,这些类的用途主要包含两种:

  1. 作为和基本数据类型对应的类型存在,方便涉及到对象的操作,如 Object[ ]、 集合等的操作。
  2. 包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法 (这些操作方法的作用是在基本数据类型、包装类对象、字符串之间提供相互 之间的转化!)。

包装类的使用

public class Test {
    public static void main(String[ ] args) {
        Test test = new Test();
        test.testInteger();
    }
    /** 测试 Integer 的用法,其他包装类与 Integer 类似 */
    void testInteger() {
        // 基本类型转化成 Integer 对象
        Integer int1 = new Integer(10);
        Integer int2 = Integer.valueOf(20); // 官方推荐这种写法
        // Integer 对象转化成 int
        int a = int1.intValue();
        // 字符串转化成 Integer 对象
        Integer int3 = Integer.parseInt("334");
        Integer int4 = new Integer("999");
        // Integer 对象转化成字符串
        String str1 = int3.toString();
        // 一些常见 int 类型相关的常量
        System.out.println("int 能表示的最大整数:" + Integer.MAX_VALUE);
    }
}

自动装箱和拆箱

        自动装箱和拆箱就是将基本数据类型和包装类之间进行自动的互相转换。JDK1.5 后, Java 引入了自动装箱(autoboxing)/拆箱(unboxing)。

自动装箱:

        基本类型的数据处于需要对象的环境中时,会自动转为“对象”。

        我们以 Integer 为例:在 JDK1.5 以前,这样的代码 Integer i = 5 是错误的,必须要通过 Integer i = new Integer(5) 这样的语句来实现基本数据类型转换成包装类的过程; 而在 JDK1.5 以后,Java 提供了自动装箱的功能,因此只需 Integer i = 5 这样的语句就能 实 现 基 本 数 据 类 型 转 换 成 包 装 类 , 这 是 因 为 JVM 为 我 们 执 行 了 Integer i = Integer.valueOf(5)这样的操作,这就是 Java 的自动装箱。

自动拆箱:

        每当需要一个值时,对象会自动转成基本数据类型,没必要再去显式调用 intValue()、doubleValue()等转型方法。

        Integer i = 5;int j = i; 这样的过程就是自动拆箱。

        自动装箱过程是通过调用包装类的 valueOf()方法实现的,而自动拆箱过程是通过调用 包装类的 xxxValue()方法实现的(xxx 代表对应的基本数据类型,如 intValue()、doubleValue() 等)。

        自动装箱与拆箱的功能事实上是编译器来帮的忙,编译器在编译时依据您所编写的语 法,决定是否进行装箱或拆箱动作,

自动装箱:

Integer i = 100;//自动装箱
//相当于编译器自动为您作以下的语法编译:
Integer i = Integer.valueOf(100);//调用的是 valueOf(100),而不是 new Integer(100)

自动拆箱:

Integer i = 100;
int j = i;//自动拆箱
//相当于编译器自动为您作以下的语法编译:
int j = i.intValue();

        所以自动装箱与拆箱的功能是所谓的“编译器蜜糖(Compiler Sugar)”,虽然使用这个功 能很方便,但在程序运行阶段您得了解 Java 的语义。例如示例 8-5 所示的程序是可以通过 编译的:

包装类空指针异常问题:

public class Test {
    public static void main(String[ ] args) {
        Integer i = null;
        int j = i;
    }
}

以上代码相当于如下代码

public class Test {
    public static void main(String[ ] args) {
        Integer i = null;
        int j = i.intValue();
    }

}

        null 表示 i 没有指向任何对象的实体,但作为对象名称是合法的(不管这个对象名称存 是否指向了某个对象的实体)。由于实际上 i 并没有指向任何对象的实体,所以也就不可能 操作 intValue()方法,这样上面的写法在运行时就会出现 NullPointerException 错误。

自动装箱与拆箱:

public class Test {
    public static void main(String[ ] args) {
        Integer b = 23; // 自动装箱
        int a = new Integer(20); //自动拆箱
        Integer c = null;
        int d = c; // 此处其实就是:c.intValue(),因此抛空指针异常。
    }
}

包装类的缓存问题

        整型、char类型所对应的包装类,在自动装箱时,对于-128~127之间的值会进行缓存处 理,其目的是提高效率。

        缓存处理的原理为:如果数据在-128~127这个区间,那么在类加载时就已经为该区间的 每个数值创建了对象,并将这256个对象存放到一个名为cache的数组中。每当自动装箱过程 发生时(或者手动调用valueOf()时),就会先判断数据是否在该区间,如果在则直接获取数组中对应的包装类对象的引用,如果不在该区间,则会通过new调用包装类的构造方法来创 建对象。

Integer 类相关源码:

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

这段代码中我们需要解释下面几个问题:

1. IntegerCache类为Integer类的一个静态内部类,仅供Integer类使用。

2. 一般情况下 IntegerCache.low为-128,IntegerCache.high为127,IntegerCache.cache为 内部类的一个静态属性

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) {
            try {
                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);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;
        cache = new Integer[(high - low) + 1];
        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;
    }
    private IntegerCache() {}
}

        由上面的源码我们可以看到,静态代码块的目的就是初始化数组cache的,这个过程会 在类加载时完成。

包装类的缓存测试:

public class Test {
    public static void main(String[ ] args) {
        Integer in1 = -128;
        Integer in2 = -128;
        System.out.println(in1 == in2);//true 因为 123 在缓存范围内
        System.out.println(in1.equals(in2));//true
        Integer in3 = 1234;
        Integer in4 = 1234;
        System.out.println(in3 == in4);//false 因为 1234 不在缓存范围内
        System.out.println(in3.equals(in4));//true
    }
}

内存分析图:

JDK1.5 以后,增加了自动装箱与拆箱功能,如:Integer i = 100; int j = new Integer(100);

自动装箱调用的是 valueOf()方法,而不是 new Integer()方法。

自动拆箱调用的 xxxValue()方法。

包装类在自动装箱时为了ᨀ高效率,对于-128~127 之间的值会进行缓存处理。超过范 围后,对象之间不能再使用==进行数值的比较,而是使用 equals 方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/484301.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【新手教程】mmselfsup训练教程及常见报错处理

mmselfsup教程 1.安装mmselfsup2.了解文件结构与配置3.训练常见报错1.报错&#xff1a;FileNotFoundError: [Errno 2] No such file or directory:data/imagenet/train/./train/n04311004/images/n04311004_194.JPEG2.报错&#xff1a;报错ImportError: /mmcv/_ext.cpython-38-…

面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!

写在开头 面试官&#xff1a;小伙子&#xff0c;多线程中锁用过吗&#xff1f; 我&#xff1a;那是自然&#xff01; 面试官&#xff1a;那你知道synchronized的优化吗&#xff1f; 我&#xff1a;synchronized作为重锁&#xff0c;开销大&#xff0c;在早期不被推荐使用&…

蓝桥杯练习04学生成绩统计

学生成绩统计 介绍 随着大数据的发展&#xff0c;数据统计在很多应用中显得不可或缺&#xff0c;echarts作为一款基于JavaScript的数据可视化图表库&#xff0c;也成为了前端开发的必备技能&#xff0c;下面我们一起来用echarts开发一个学生数据统计的柱形图。 准备 开始答…

leetcode LCR121.寻找目标值-二维数组

目录 问题描述示例具体思路思路一思路二 代码实现 问题描述 m*n 的二维数组 plants 记录了园林景观的植物排布情况&#xff0c;具有以下特性&#xff1a; 每行中&#xff0c;每棵植物的右侧相邻植物不矮于该植物&#xff1b; 每列中&#xff0c;每棵植物的下侧相邻植物不矮于该…

狂卷java基础八股

equals和的区别 和equals都是进行一个数据的对比的。 但是如果是在进行的对象的对比的时候。 对比的就是对象的一个地址&#xff0c;但是equals是比较对方具体的值。 hashcode和equals 如何进行使用&#xff1a;靠反射。 java代理模式的实现&#xff1a; 静态代理&#xff1…

VMware Workstation Pro 17虚拟机超级详细搭建(含redis,nacos,docker, rabbitmq,sentinel,elasticsearch....)(一)

今天从零搭建一下虚拟机的环境&#xff0c;把nacos&#xff0c;redis等微服务组件还有数据库搭建到里面&#xff0c;首先看到的是我们最开始下载VMware Workstation Pro 17 之后的样子&#xff0c;总共一起应该有三部分因为篇幅太长了 下载地址 : VMware - Delivering a Digit…

面试题 之 react

1.说说对react的理解 1️⃣是什么 React是用于构建用户界面的 JavaScript 库,遵循组件设计模式、声明式编程范式和函数式编程概念&#xff0c;更高效使用虚拟 DOM 来有效地操作 DOM &#xff0c;遵循从高阶组件到低阶组件的单向数据流。 react 类组件使用一个名为 render() 的方…

【每周赠书活动第1期】Python编程 从入门到实践 第3版(图灵出品)

编辑推荐 适读人群 &#xff1a;本书适合对Python感兴趣的所有读者阅读。 编程入门就选蟒蛇书&#xff01; 【经典】Python入门经典&#xff0c;常居Amazon等编程类图书TOP榜 【畅销】热销全球&#xff0c;以12个语种发行&#xff0c;影响超过 250 万读者 【口碑】好评如潮…

QToolButton 设置图标变灰

1、目的 使用一张图片来实现QToolButton控件两种状态&#xff08;ON和OFF状态&#xff09;的图标。前提不能使用两张图片&#xff0c;也不能使用setEnable来图标变灰&#xff0c;因为当设置了false之后&#xff0c;控件将不能再切换了。 2、方法 知道可以通过QToolButton有s…

JDK安装卸载,path配置,JAVA_HOME配置

文章目录 卸载jdk安装jdk检查jdk安装后path和Java_home环境变量pathJAVA_HOME 卸载jdk 控制面板 —>卸载程序 选择对应的jdk右键卸载&#xff08;我这里还没有jdk&#xff09; 安装jdk 路径都要注意&#xff1a;不能有中文&#xff0c;不能有空格 正在安装 检查 …

亚马逊跨境电商为什么要多备几个店铺?多店铺运营技巧

在亚马逊&#xff0c;链接断货超过15天的话就会降权&#xff0c;之后想要把权重升回来是要下不少功夫的&#xff0c;如果这时候有一个备用店铺的话&#xff0c;就可以跟卖自己大号的链接&#xff0c;先保持出单&#xff0c;把权重稳住那么多店铺就需要多个信用卡进行扣店铺租金…

啥是反射???

在Java编程中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的工具&#xff0c;它允许程序在运行时检查类、接口、字段和方法的信息&#xff0c;并且可以动态地创建和操作对象。 一、反射的基本概念 反射是Java语言的一个特性&#xff0c;它允许程序在运行时对…

鸿蒙开发学习:【华为支付服务客户端案例】

简介 华为应用内支付服务&#xff08;HUAWEI In-App Purchases&#xff09;支持3种商品&#xff0c;包括消耗型商品、非消耗型商品和订阅型商品。 消耗商品&#xff1a;仅能使用一次&#xff0c;消耗使用后即刻失效&#xff0c;需再次购买。非消耗商品&#xff1a;一次性购买…

chatGPT中文在线版本(亲测可用

ChatGPT是一个先进的自然语言处理模型&#xff0c;由OpenAI开发。它通过深度学习技术训练而成&#xff0c;可以进行对话、回答问题等多种自然语言处理任务。对于学生、开发者、研究人员和任何对人工智能感兴趣的人来说&#xff0c;这是一个非常有用的工具。 最近找到一个国内可…

ChatGPT论文指南|总结7个ChatGPT学术论文润色与评价好用的口诀!【建议收藏】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼&#xff1a; ChatGPT论文指南|分享13个学术论文写作ChatGPT口诀&#xff01;【建议收藏】 目录 1.论文润色 2.论文评价 3.书籍介绍 AIPaperPass智能论文写作平…

《自动机理论、语言和计算导论》阅读笔记:p1-p4

《自动机理论、语言和计算导论》学习第1天&#xff0c;p1-p4&#xff0c;总计4页。这只是个人的学习记录&#xff0c;因为很多东西不懂&#xff0c;难免存在理解错误的地方。 一、技术总结 1.有限自动机(finite automata)示例 1.software for checking digital circuits。 …

3.24作业

基于UDP的网络聊天室 项目需求&#xff1a; 如果有用户登录&#xff0c;其他用户可以收到这个人的登录信息如果有人发送信息&#xff0c;其他用户可以收到这个人的群聊信息如果有人下线&#xff0c;其他用户可以收到这个人的下线信息服务器可以发送系统信息 服务器端代码 #in…

esp32CAM环境搭建(arduino+MicroPython+thonny+固件)

arduino ide 开发工具 arduino版本&#xff1a;1.8.19 arduino ide 中文设置&#xff1a;​ file >> preferences >> ​ arduino IDE 获取 ESP32 开发环境&#xff1a;打开 Arduino IDE &#xff0c;找到 文件>首选项 ,将 ESP32 的配置链接填入附加开发板管理网…

FOCUS-AND-DETECT: A SMALL OBJECTDETECTION FRAMEWORK FOR AERIAL IMAGES

摘要 为了解决小对象检测问题&#xff0c;提出了一个叫做 Focus-and Detect 的检测框架&#xff0c;它是一个两阶段的框架。 第 一阶段包括由高斯混合模型监督的对象检测器网络&#xff0c;生成构成聚焦区域的对象簇 。 第二阶段 也是一个物体探测器网络&#xff0c;预测聚焦…

10基于访问权限控制和细粒度控制的方式访问资源

访问权限控制 RBAC 基于角色的访问控制(Role-Based Access Control)是按角色进行授权,如主体的角色为总经理时才可以查询企业运营报表和员工工资信息等 缺点&#xff1a;查询工资所需要的角色变化为总经理和部门经理&#xff0c;此时就需要修改判断逻辑为判断用户角色是否为…