【JavaSE专栏6】Java 基本类型转换、包装类、自动装箱、自动拆箱

news2025/1/16 16:01:12

作者主页:Designer 小郑
作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue、SpringBoot和微信小程序)、系统定制、远程技术指导。CSDN学院、蓝桥云课认证讲师,全栈领域优质创作者。热爱技术、专注业务、开放合作、乐于分享,期待你我共同成长!
主打方向:Vue、SpringBoot、微信小程序

目录

    • 一、基本数据类型转换
      • 1.1 为什么要进行转换
      • 1.2 自动类型转换(隐式转换)
        • 1.2.1 自动类型转换1——直接赋值
        • 1.2.2 自动类型转换2——运算时转换
      • 1.3 强制类型转换(显示转换)
      • 1.3 类型转换小结
    • 二、自动装箱和自动拆箱
      • 2.1 包装类是什么?
      • 2.2 为什么要用包装类?
      • 2.3 自动装箱
      • 2.4 自动拆箱
      • 2.5 性能比较
        • 2.5.1 测试基本类型
        • 2.5.2 测试包装类
        • 2.5.3 测试小结
    • 三、课时小结

一、基本数据类型转换

在学习基本数据类型转换之前,首先要了解为什么要进行基本数据类型转换

1.1 为什么要进行转换

在上一节课时中,提到了 Java 数据类型的层级,如下图所示。

在这里插入图片描述

Java 作为一个强类型的编程语言,在不同数据类型之间进行转换时,需要进行手动 / 自动转换。

byte 的数据范围是 -128 到 127,如果将数值 128 直接赋值给 byte 类型的数据,IntelliJ IDEA 会编译报错,如下图所示。

在这里插入图片描述
所以需要进行数据转换,请看以下代码:

public class Main {
    public static void main(String[] args) {

        int a = 128;
        byte b = (byte) a;
        System.out.println("答案 = " + b);
    }
}

最终输出结果为:

答案 = -128

因为 128 超过了 byte 的数据范围,则重新计数赋值,第一个值为 -128

通过以上一个简单的例子,同学们只需简单了解下为什么要进行数据类型转换即可。

只要参与运算的基本数据类型不一致时,就会发生数据类型的转换

Java 中基本数据类型的转换主要分为两类

  • 自动转换类型(隐式转换)
  • 强制转换类型(显示转换)

接下来逐个讲解。


1.2 自动类型转换(隐式转换)

自动类型转换,顾名思义就是自动进行数据类型转换。

由 Java 编译器进行自动处理,Java 代码不需要经过任何处理

小类型到大类型是自动提升的,那什么是小类型和大类型呢?如下图所示,箭头非被指结点为相对小类型,反之箭头被指结点为相对大类型,如 short 相对于 int 来说就是小类型。

在这里插入图片描述


1.2.1 自动类型转换1——直接赋值

小类型变量赋值给大类型时,会触发自动类型转换,比如:

public class Main {
    public static void main(String[] args) {

        long a = 1;
    }
}

数值 1int 类型,而承载的变量为 long 类型,则数值 1 会被自动转换为 1L


1.2.2 自动类型转换2——运算时转换

小类型变量和大类型变量进行运算时,会将小类型提升为大类型,再进行数学运算,如下所示。

public class Main {
    public static void main(String[] args) {

        int a = 1;
        long b = 5L + a;
    }
}

比如变量 a 为 int 类型,在计算 5L + a 时,会首先将 a 转换为 1L,再计算 5L + 1L = 6L,最终得出 6L 结果。

简单来说 long + int 会自动转换为 long + long 再进行计算。

同理 int + double 也会自动转换为 double + double 再进行计算,如下代码所示。

public class Main {
    public static void main(String[] args) {

        int a = 1;
        double b = 3.14 + a;
    }
}

1.3 强制类型转换(显示转换)

大类型转为小类型时,需要强制类型转换,可能会导致数据丢失。

比如 int 类型的取值范围是 -2^31到2^31-1byte 类型的取值范围是 -2^7到2^7-1

int 类型转换为 byte 类型时,会出现数据溢出的情况,如下代码所示。

public class Main {
    public static void main(String[] args) {

        int a = 128;
        byte b = (byte) a;
        System.out.println("b = " + b);
    }
}

最终输出的结果为 b = -128,即发生了数据溢出情况,也可以理解为数据丢失。

同理,在 double 类型强制转换为 int 时,也会出现数据精度丢失(数据丢失),如下代码所示。

public class Main {
    public static void main(String[] args) {

        double a = 3.1415926;
        int b = (int) a;
        System.out.println("b = " + b);
    }
}

输出结果为 b = 3,即发生了数据精度丢失情况,也可以理解为数据丢失。


1.3 类型转换小结

关于 Java 的数据类型转换,同学们需要理解以下三点:

  • 大转小:强制类型转换,如下:
int a = 6;
byte b = (byte) a;

提示:对于 byte 和 int 类型之间的转换中需要注意,当把一个 int 数值赋值给 byte 变量时,不管是否超过范围,都需要强制转换。

  • 小转大:自动类型转换,如下:
int a = 6;
long c = a;
  • 默认定义类型

整数的默认类型为 int
整数带有后缀 L 时类型为 long
浮点数的默认类型为 double
浮点数带有后缀 f 时类型为 float

提示:关于 String 的类型转换,将在后续的课时中讲解,因为 String 不属于 Java 的基本数据类型。


二、自动装箱和自动拆箱

在学习自动装箱和自动拆箱之前,首先了解什么是包装类。

2.1 包装类是什么?

在 jdk1.4 中,新增了 8 个基本数据类型的对应包装类,如下表所示。

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

基本数据类型的对应包装类的方式基本相同,但在 JVM 上的分配有所不同,具体将在后续的课时中讲解,同学们只需知道在时间或空间上,基本数据类型优于对应包装类即可。


2.2 为什么要用包装类?

从 jdk1.5 开始,定义集合需要使用包装类。定义普通数组,使用基本类型和包装类都可,如下代码所示。

public class Main {
    public static void main(String[] args) {

        /**
         * 普通数组的定义方法
         */
        int[] a = new int[10];
        /**
         * 集合的定义方法
         */
        List<Integer> arr = new ArrayList<>();
        /**
         * 对基本类型的集合定义需要转为包装类
         */
        // List<int> arr = new ArrayList<>(); // 编译错误
    }
}

关于集合的用法,会在下面的课时中讲解,同学们只需要了解包装类的使用场景即可。


2.3 自动装箱

自动装箱是什么?基本类型自动转换为包装类型就是自动装箱

请看以下代码:

public class Main {
    public static void main(String[] args) {

        /**
         * 直接赋值
         */
        Integer a = 666;
        /**
         * 包装类的静态工厂方法
         */
        Integer b = Integer.valueOf(666);
        /**
         * 构造器赋值,在现有 JDK 中已被废弃
         */
        Integer c = new Integer(666);
    }
}

在对 Integer 类型的变量赋值时,666 这是一个基本数据类型,而变量 abc 为包装类。

自动装箱,就是将一个基本类型直接赋值给包装类型的过程。

如果没有自动装箱,以上代码无法通过 JVM 编译。


2.4 自动拆箱

自动拆箱是什么?包装类型自动转换为基本类型就是自动拆箱

请看以下代码:

public class Main {
    public static void main(String[] args) {

        Integer a = 666;
        int b = 666;
        System.out.println("判断 1 = " + (a == b));
        System.out.println("判断 2 = " + Objects.equals(a,b));
    }
}

代码中分别定义基本类型和包装类,赋同样的值,最后判断是否相等,输出为:

判断 1 = true
判断 2 = true

其中变量 a 在比较之前,自动拆箱为基本类型,然后在于 b 进行比较,最后得出 true 的结果。

如果不进行自动拆箱,两个不同类型的变量无法进行比较

就好比拿 苹果电视 比较性能,这是不可行的。

Java 只能将包装类 Integer 拆箱为 int 才能和 int 值进行比较。

这就是 自动拆箱


2.5 性能比较

同学们学习自动装箱、自动拆箱之后,还需要了解它们的性能差距。

因为,这将影响你在实战开发中,决定常用哪个,最终影响你的程序性能。


2.5.1 测试基本类型

首先对基本数据类型进行测试,代码如下所示。

public class Main {

    private static final long MAX_NUMBER = 1000000000;
    public static void main(String[] args) {

        long start = System.currentTimeMillis();
        long sum = 0;
        for(long i = 0; i < MAX_NUMBER; i ++) {
            sum += i;
        }
        long end = System.currentTimeMillis();

        System.out.printf("耗时 = " + (end - start) + ",计算结果 = " + sum);
    }
}

最后输出结果:

耗时 = 304,计算结果 = 499999999500000000

2.5.2 测试包装类

接着对包装类进行测试,代码如下所示。

public class Main {

    private static final Long MAX_NUMBER = 1000000000L;
    public static void main(String[] args) {

        long start = System.currentTimeMillis();
        Long sum = 0L;
        for(Long i = 0L; i < MAX_NUMBER; i ++) {
            sum += i;
        }
        Long end = System.currentTimeMillis();

        System.out.printf("耗时 = " + (end - start) + ",计算结果 = " + sum);
    }
}

最后输出结果:

耗时 = 6374,计算结果 = 499999999500000000

2.5.3 测试小结

由此可见,使用包装类虽然简便,但频繁自动装拆箱会带来性能低下的问题。

所以在实战开发中,建议使用基本数据类型

如果一定要使用包装类的场景下,再去使用包装类。

在 2.1 小节 也提到过,基本类型无论是在时间还是空间上都是优于引用类型(如包装类)的。


三、课时小结

在本节课时中,讲解了低转高、高转低的 Java 基本类型转换,接着学习了包装类的概念,再引申出自动装箱、自动拆箱的概念,最后分别进行了性能测试。在下节课时中,将学习 Java 变量、常量及其作用域的知识。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot05:员工管理系统

先不连接数据库&#xff0c;后面整合了mybatis再补充 步骤&#xff1a; 1、导入静态资源 下载地址&#xff1a;下载 - KuangStudy 2、在pojo包下写实体类 ①Department //部门表 Data AllArgsConstructor NoArgsConstructor public class Department {private Integer id;…

IPV4地址详解

文章目录IPV4地址分类编址划分子网无分类编制CIDR路由聚合应用规划&#xff08;子网划分的细节&#xff09;定长的子网掩码FLSM变长的子网掩码VLSMIPV4地址 IPV4地址就是给因特网&#xff08;Internet&#xff09;上的每一台主机&#xff08;或路由器&#xff09;的每一个接口…

恶意代码分析实战 2 动态分析基础技术

2.1 Lab3-1 使用动态分析基础技术来分析在Lab03-01.exe文件中发现的恶意代码。 问题 找出这个恶意代码的导入函数与字符串列表。 C:\Documents and Settings\Administrator>strings Lab03-01.exe ExitProcess kernel32.dll ws2_32 cksu advapi32 ntdll user32 StubPath SO…

39.Isaac教程--使用 Pose CNN 解码器进行 3D 物体姿态估计

使用 Pose CNN 解码器进行 3D 物体姿态估计 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录使用 Pose CNN 解码器进行 3D 物体姿态估计应用概述推理模块Pose CNN 解码器训练模块Pose CNN 解码器架构Pose CNN解码器训练从场景二进制文件生…

JAVA BIO与NIO、AIO的区别

1、 IO模型发展 在Java的软件设计开发中&#xff0c;通信架构是不可避免的&#xff0c;我们在进行不同系统或者不同进程之间的数据交互&#xff0c;或者在高并发下的通信场景下都需要用到网络通信相关的技术&#xff0c;对于一些经验丰富的程序员来说&#xff0c;Java早期的网…

通信原理简明教程 | 现代数字调制

文章目录1 多进制基带信号2 多进制数字调制2.1 多进制调制的基本原理2.2 MPSK调制3 MSK3.1 MSK信号的表示3.2 MSK的相位网格图3.3 MSK的产生和解调4 QAM4.1 QAM的基本原理4.2 QAM信号的产生和解调4.3 QAM信号的特性5 正交频分复用5.1 OFDM的基本思想5.2 OFDM的基本原理5.3 基于…

Python基础学习 -- 常用模块

一、time模块1、时间戳可以理解为是一个计算机世界的当前时间&#xff0c;很多加密验证什么的&#xff0c;都会用到import time ttime.time() print(int(t)) 运行结果&#xff1a; 16732534522、当前时间import time ttime.strftime("%Y-%m-%d %X") print(t) 运行结果…

vue项目搭建(offline方式)

项目搭建的前提 需要安装node.js&#xff0c;安装步骤可参考https://blog.csdn.net/qq_44628230/article/details/122634132 1.检查环境是否已准备好 2.全局安装vue-cli 3.进入到项目目录&#xff0c;创建一个基于 webpack 模板的新项目&#xff08;online&#xff09; 4.由…

JavaScript笔记+案例

前端开发 第四节JavaScript JavaScript&#xff1a;概要 概要&#xff1a; JavaScript&#xff0c;是一门编程语言。浏览器就是JavaScript语言的解释器。 DOM和BOM 相当于编程语言内置的模块。 例如&#xff1a;Python中的re、random、time、json模块等。jQuery 相当于是编程…

搭建代理服务器

搭建代理服务器搭建代理服务器场景ccproxy进行搭建代理服务器proxifier配置代理服务器总结搭建代理服务器 有这种情况&#xff0c;在家需要访问某个内网环境&#xff0c;但是内网的ip从外网是访问不到的&#xff0c;这种需要怎么处理呢&#xff1f; 答案是使用代理服务器。 …

索引失效原因

目录 1.最佳左前缀法则 2.不在索引列上做任何操作 3.存储引擎不能使用索引中范围条件右边的列 4.尽量使用覆盖索引 5.mysql 在使用不等于(! 或者<>)的时候无法使用索引会导致全表扫描 6..is null ,is not null 也无法使用索引 7.like以通配符开头(%abc...)mysql索…

tkinter布局详解

文章目录placepackgrid前情提要&#xff1a; Python UI 界面 tkinter初步Tkinter共有三种布局方案&#xff0c;分别是绝对位置布局 place&#xff0c; 相对位置布局 pack和网格布局 grid。place place是通过声明具体位置来进行布局的方法&#xff0c;这个具体位置既可以绝对坐…

【大数据管理】Java实现布谷鸟过滤器(CF)

实现布谷鸟过滤器&#xff0c;每当有一个小说被存储后将其加入布谷鸟过滤器&#xff0c;并能够使用布谷鸟过滤器查询上述小说是否已经被存储 一、解题思路 在介绍布谷鸟过滤器之前&#xff0c;首先需要了解布谷鸟哈希的结构。最简单的布谷鸟哈希结构是一维数组结构&#xff0…

JAVA基础知识05面向对象

目录 面向对象概述 为什么要学习面向对象&#xff1f; 1. 类和对象 1.1 类的介绍 1.2 类和对象的关系 组织代码 1.3 类的组成 1.4 创建对象和使用对象的格式 2. 对象内存图 2.1 单个对象内存图 2.2 两个对象内存图 3. 成员变量和局部变量 4. this 关键字 4.1 t…

【c语言进阶】结构体最常用知识点大全

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;c语言学习 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我…

【电动车】基于多目标优化遗传算法NSGAII的峰谷分时电价引导下的电动汽车充电负荷优化研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

使用Redission和Aop以及注解实现接口幂等性

关于什么是接口幂等性这里不再赘述&#xff0c;本文将使用分布式锁来解决接口幂等性的问题。 本文接口幂等判断标准&#xff1a; String name IP 请求方式 URI 参数摘要值 当相同的name来临时&#xff0c;且上一个相同name对于的接口还未正常执行完毕&#xff0c;则判断为…

Python ·信用卡欺诈检测【Catboost】

Python 信用卡欺诈检测【Catboost】 提示&#xff1a;前言 Python 信用卡欺诈检测 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录Python 信用卡欺诈检测【Catboost】前言一、导入包二、加载数据三、数据可视化四、…

鱼雷的发射角设置

过年嘛 放松个五六天啥的 玩了个猎杀潜航的游戏觉得那玩意挺有意思的开年了 要美赛 写个设置鱼雷发射角的小程序玩玩 游戏嘛,反正大概简易版就是这个框架,自己补充呗 各种设定啥的,没怎么关心,就是总结一下里面的平面几何..水个文章玩玩顺便练习一下pptx绘图美赛的时候估计还是…

30. PyQuery: 基于HTML的CSS选择器

目录 前言 导包 基本用法 按标签选择 标签链式操作 简便链式&#xff1a;后代选择器 类选择器 id 选择器 属性/文本选择器&#xff08;重点&#xff09; 改进多标签拿属性方法 快速总结 PyQuery的强大功能&#xff1a;修改源代码 添加代码块 修改/添加属性 删…