【java基础】包装类,自动装箱和自动拆箱

news/2024/10/30 20:15:30/

文章目录

  • 基本介绍
  • 包装类
  • 自动装箱
  • 自动拆箱
  • 包装类注意事项
    • 包装类比较
    • 包装器内容不可变

基本介绍

有时,需要将int这样的基本类型转换为对象。所有的基本类型都有一个与之对应的类。
例如,Integer类对应基本类型int。通常,这些类称为包装器(wrapper)。这些包装器类有显而易见的名字:Integer、Long、Float、Double、Short、Byte、Character和Boolean(前6个类派生于公共的超类number)。

包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时,包装器类还是final,因此不能派生它们的子类。

包装类

每个基本数据类型都对应一个包装类,名称就是首字母大小。包装类是一个类,所以拥有许多方法,我们可以利用这些方法很任意的对数据进行操作,下面以Interger进行举例

The Integer class wraps a value of the primitive type int in an object. An object of type Integer contains a single field whose type is int.
In addition, this class provides several methods for converting an int to a String and a String to an int, as well as other constants and methods useful when dealing with an int.

上面就是Interger类上的注释,就表示Integer就是包含了int值的对象,提供了一些int->String和String->int 的方法

    public static void main(String[] args) {int num = Integer.parseInt("111", 2);System.out.println(num); // 输出7}

上面就是一个例子,我们可以利用Integer的静态方法parseInt将字符串转换为int,还可以指定进制。
对于创建Integer对象,有2种方法,如下

        // 通过构造器创建Integer integer1 = new Integer(7);//通过静态方法valueOf创建Integer integer2 = Integer.valueOf(8);

创建了Integer对象后就可以使用一系列的方法了
在这里插入图片描述

具体使用方法参考api文档,对于其他几个包装类使用方法类似

自动装箱

自动装箱就是在需要的时候,基本数据类型会自动被装配成为对应的包装类,这里还是使用int和Integer进行举例

        Integer a = 1;

上面代码我们直接将基本数据类型赋值给了一个类,按理来说,这个代码应该报错,事实上,上面代码并不会报错,就是因为自动装箱机制。上面代码等价于下面代码

        Integer a = Integer.valueOf(1);

对于int来说,自动装箱就是在有需要的时候就会自动被装配为Integer

自动拆箱

自动拆箱就是自动装箱的逆过程,在需要的时候,包装类会被自动转换为对应的基本数据类型,还是使用int和Integer进行举例

        Integer a = new Integer(1);a++;System.out.println(a);

上面的代码我们使用对对象使用了++运算符,这是不运行的,但是由于自动拆箱机制,在执行a++这行代码时,会将a转换为int,然后再执行++操作,然后再转换回Integer。等价于下面代码

        Integer a = new Integer(1);int b = a.intValue();b++;a = Integer.valueOf(b);System.out.println(a);

包装类注意事项

包装类比较

我们对包装类的比较不要使用2个等号来进行比较,因为对象使用 == 比较的是地址,例如下面代码

        Integer a = 10000;Integer b = 10000;System.out.println(a == b); // 输出false

我们应当使用 a.equals(b)来进行比较

        Integer a = 10000;Integer b = 10000;System.out.println(a.equals(b)); // 输出true

对于自动装箱有一些注意事项如下

自动装箱规范要求boolean、byte、chars127,介于-128和127之间的short和int
被包装到固定的对象中。例如,如果在前面的例子中将a和b初始化为100,那么它们
的比较结果一定成功。

我们将上面代码中的a和b改成100,那么使用==比较将会输出true

        Integer a = 100;Integer b = 100;System.out.println(a == b); // 输出true

应为对于Integer,值为-128 – 127的Integer对象已经创建了缓存起来了,构建Integer对象时不会创建新的对象,具体内容参考Integer里面的IntegerCache类
在这里插入图片描述

包装器内容不可变

还是使用Integer进行举例,只要我们在构建Integer后,那么Integer的值就已经不能够改变了,应为Integer里面的值是使用final进行修饰的
在这里插入图片描述


http://www.ppmy.cn/news/28227.html

相关文章

闭包与高阶函数

文中内容均来自于曾探《JavaScript设计模式与开发实践》的学习笔记。闭包作用域变量的作用域,就是指变量的有效范围。局部变量、全局变量。变量的搜索是从内到外而非从外到内的。变量的生命周期对于全局变量莱索,全局变量的生命周期是永久的,…

RabbitMQ交换机(Exchanges)

目录 一、概念 二、临时队列 三、绑定 四、Fanout(扇出交换机) (一)介绍 (二)实战 五、Direct(直接交换机) (一)介绍 (二)实…

Gradle7.4安装与基本使用

文章目录一.前言二.下载Gradle三.Gradle镜像源-全局级配置四.配置Gradle wrapper-项目级配置五.Gradle对测试的支持五.生命周期5.1 settings文件六.Gradle任务入门6.1 任务行为6.2 任务依赖方式七. Dependencies依赖引入7.1 依赖冲突及解决方案八.Gradle整合多模块SpringBoot九…

【异常检测三件套】系列3--时序异常检测综述

写在前面: 异常检测共包含3个内容,从多个方面剖析异常检测方法,本文为第三篇。过往内容请查看以下链接: 【异常检测三件套】系列1--14种异常检测算法https://blog.csdn.net/allein_STR/article/details/128114175?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%…

Linux 进程:理解进程和pcb

目录一、进程的概念二、CPU分时机制三、并发与并行1.并发2.并行四、pcb的概念一、进程的概念 什么是进程? 进程就是进行中的程序,即运行中的应用程序。比如:电脑上打开的LOL、QQ…… 这些都是一个个的进程。 什么是应用程序? 应用…

Scratch少儿编程案例-算法练习-实现华氏和摄氏度温度转换

专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者

JUC包:CountDownLatch源码+实例讲解

1 缘起 有一次听到同事谈及AQS时,我有很多点懵, 只知道入队和出队,CLH(Craig,Landin and Hagersten)锁,并不了解AQS的应用, 同时结合之前遇到的多线程等待应用场景,发现…

JavaScript 库

JavaScript库是一组封装好的JavaScript函数和对象,可以重复利用和调用,用于简化开发过程中的编码和实现,提高开发效率和可维护性。在实际工作中,JavaScript库是一个非常常用的工具,常用的库包括jQuery、React、Vue.js等…