为什么要有包装类?

news2025/1/10 22:23:20

1、典型回答

在 Java 中,所有的基本类型都会对应一个包装类,如下所示:

之所以要有包装类型的主要原因有以下几个:

  1. 面向对象要求:Java 是一门面向对象的编程语言,要求所有的数据都应该是对象。但是,基本数据类型(如 int、char、double等)并不是对象,它们没有成员方法和其他面向对象的特性。为了满足面向对象编程的要求,Java 引入了包装类,将基本数据类型封装成对象,使得它们也具有面向对象的特性。例如集合的操作只能是对象,而不能为基础数据类型
  2. 提供了更多的功能和方法:包装类提供了一些额外的方法和功能,例如执行数学运算、比较大小、转换数据类型 Integer.valueOf(n) 等方法
  3. 泛型要求:泛型(Generics)是 Java 中很重要的特性,它提供了类型安全和代码重用的功能。但是,泛型要求类型参数必须是对象类型,不能是基本数据类型。因此,如果想在泛型中使用基本数据类型,就需要使用对应的包装类
  4. 表示 null 值:包装类可以表示 null 值,而基本数据类型不能。这在某些场景下很有用,比如在接口传参中,如果使用包装类即使前端不传参也不会报错,而使用基本数据类型,如果前端忘记传参就会报错

2、全面剖析

包装类存在的意义是:面向对象编程的要求、提供了更多的功能和方法、泛型要求、以及可以用它来表示 null 值

包装类常用的场景有:

  1. 用于泛型数据存储
  2. 用于集合类数据存储
  3. 方法的参数传递

2.1、定义泛型

泛型类型定义不能为基本数据类型,否则编译期就会报错,如下代码所示:

但使用包装类型则完全没有问题:

2.1、集合类的数据存储

集合类的操作必须是对象,而非基础数据类型,这点大家可能会有疑问,说不对呀,我平常 int 类型也可以直接添加到集合中,如下代码所示:

但你把上面的代码反编译一下就能看出“端倪”,以上代码反编译之后的代码如下:

也就是说,当你使用 int 基本数据类型时,编译器会帮你自动转换成包装类型,所以集合操作的底层还是对象,而非基础数据类型

2.3、方法参数传递

在接口传参中,一定要使用包装类,因为包装类的默认值是 null,所以在使用包装类接收参数时,即使前端没有传递任何参数,那么参数的值就是 null,但程序不会报错;而如果使用的是基本数据类型来接收参数,那么,如果前端忘记传递参数了,程序就会报错(状态码为 500 的内部错误),所以方法传参一定要使用包装类

3、知识扩展

3.1、装箱和拆箱

装箱(Boxing)和 拆箱(Unboxing)是 Java 语言中,用于基本数据类型和包装类之间互相转换的过程

装箱是指将基本数据类型转换为对应的包装类对象。Java编译器会自动将基本数据类型转换为对应的包装类对象,这称为自动装箱

例如,将 int 类型的值赋给 Integer 对象:

拆箱是指将包装类对象转换为对应的基本数据类型。同样,Java 编译器会自动将包装类对象转换为对应的基本数据类型,这称为自动拆箱

例如,将 Integer 对象赋给 int 类型的变量:

 

装箱和拆箱的过程在编译时由编译器自动完成,使得基本数据类型和包装类之间可以方便地进行转换。这样就可以在需要使用包装类的场景(如泛型、集合类、反射等)中传递和操作基本数据类型的值

注意事项

但需要注意的是,装箱和拆箱的过程中可能涉及到对象的创建和销毁,可能会引入额外的开销和性能消耗。因此,在性能要求较高的场景中,应尽量避免频繁的装箱和拆箱操作,以减少额外的开销

3.2、包装类缓存

在 Java 中,对于某些特定的包装类对象,JVM会对其进行缓存,以提高性能和节省内存空间,而这个机制就叫做包装类缓存,也叫做包装类的高速缓存

例如 Integer 的缓存,Integer 类内部实现了一个高速缓存,称为 Integer Cache。这个缓存用于缓存一定范围内的整数对象,以提高性能和减少内存消耗。这个特性在 Java5 及之后的版本中引入

Integer 类对于小整数值(默认范围为 -128 到 127)会在初始化时创建缓存,即预先创建这些整数对象并存储在一个数组中。当代码中需要创建一个该范围内的整数对象时,实际上是从缓存中获取已存在的对象,而不是每次都创建一个新的对象。这样做的好处是,对于常用的小整数值,不会产生大量的重复对象,从而节省了内存和提高了性能。

这个缓存的范围可以通过 JVM 参数进行调整,例如,可以通过设置 -XX:AutoBoxCacheMax=<Size> 来增加缓存的范围。

值得注意的是,对于超过缓存范围的整数值,每次都会创建一个新的 Integer 对象,而不会从缓存中获取。因此,使用整数时要注意是否处于缓存范围,避免在比较整数对象时产生不符合预期的结果

以下是一个简单 Integer 高速缓存的例子:

public class IntegercacheDemo{
    public static void main(string[]args){
        Integer a = 10;  // 缓存范围内的整数,从缓存中获取
        Integer b = 10;  // 缓存范围内的整数,从缓存中获取
        Integer c = 128; // 超出缓存范围,创建新的对象
        Integer d = 128; // 超出缓存范围,创建新的对象
        System.out.println("a == b:" + (a== b));  // 输出:a==b:true,因为a和b引用的是缓存中同一个对象            
        System.out.println("c == d:" + (c== d));  // 输出:c== d:false,因为c和d是两个独立的对象
    }
}

程序执行的结果:

因为 a 和 b 使用的都是缓存,所以他们两个的引用地址是一样的;而 c 和 d 超出了 int 的缓存范围,所以都是新建的对象,那么他们的引用地址自然也就不同了 

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

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

相关文章

【递归搜索回溯专栏】专题二:二叉树中的深搜----二叉搜索树中第K小的元素

本专栏内容为&#xff1a;递归&#xff0c;搜索与回溯算法专栏。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;递归搜索回溯专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代…

数据库三大范式设计原则

数据库三大范式 第一范式(确保每列保持原子性) 第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值&#xff0c;就说明该数据库表满足了第一范式。 第二范式(确保表中的每列都和主键相关) 第二范式在第一范式的基础之上更进一层。第二范式需要确保数据…

基于ARMA-GARCH模型探究股价的日历效应和节假日效应【思路+代码】

目录 1. 模型定义1.1 ARMA-GARCH模型1.2 引入节假日效应的虚拟变量的新模型1.3 引入日历效应的虚拟变量的新模型 2. 实证部分2.1 准备工作2.2 引入节假日效应虚拟变量的模型建立和结果分析2.3 引入节假日效应和日历效应的虚拟变量的模型建立和结果分析 3. 结语 本文介绍了ARMA-…

Ubuntu18.04 安装搜狗输入法

一. 概述 自己的Ubuntu 18.04系统配置中文搜狗输入法&#xff0c;安装步骤&#xff0c;亲测可用 二. 安装步骤 2.1 确认系统版本和CPU架构 查看Ubuntu系统版本号&#xff0c;通过命令 lsb_release -a wuubuntume:~$ lsb_release -a No LSB modules are available. Distr…

【全志H616】-2 写一个自己的串口

【全志H616】-2 写一个自己的串口 1、基本命令 重启 sudo rebootLinux系统下一个文件夹的文件复制到另一个文件夹下 cp flags.c /home/user05/lab09/flags_revised.c //复制当前文件夹下的 flags.c 文件到 lab09 文件夹下flags_recised.c 文件cp oled_demo.c /home/orangep…

【网络安全】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 网络安全 目录&#xff1a; &#xff08;一&#xff09; &#xff08;二&#xff09; &#xff08;三&#xff09; &#xff08;四&#xff09;

苍穹外卖中新增员工的功能是如何实现的?再复习下项目结构

一、Common、Pojo、Server分别都是干啥的&#xff1f; 在一个典型的Java应用程序中&#xff0c;通常会使用模块化的方式来组织代码&#xff0c;以提高代码的可维护性和可扩展性。常见的模块包括Common模块、POJO模块和Server模块&#xff0c;它们通常各自负责不同的功能。 Com…

Java项目源码基于springboot的家政服务平台的设计与实现

大家好我是程序员阿存&#xff0c;在java圈的辛苦码农。辛辛苦苦板砖&#xff0c;今天要和大家聊的是一款Java项目源码基于springboot的家政服务平台的设计与实现&#xff0c;项目源码以及部署相关请联系存哥&#xff0c;文末附上联系信息 。 项目源码&#xff1a;Java基于spr…

北京市行政村边界shp数据/北京市乡镇边界/北京市土地利用分类数据

北京是一座有着三千多年历史的古都&#xff0c;在不同的朝代有着不同的称谓&#xff0c;大致算起来有二十多个别称。北京地势西北高、东南低。西部、北部和东北部三面环山&#xff0c;东南部是一片缓缓向渤海倾斜的平原。境内流经的主要河流有&#xff1a;永定河、潮白河、北运…

JavaWeb-Maven

一、Maven概述 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供一套标准化的项目结构提供一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布......&#xff09;提供一套依赖管理机制 二、Maven简…

Window部署Oracle并实现公网环境远程访问本地数据库

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

闭包表(Closure Table)存储和查询树形数据结构

闭包表通过在关系表中记录树节点之间的直接和间接关系来表示节点之间的层次结构&#xff0c;目的是支持高效的树遍历和查询操作。 一、创建闭包表 CREATE TABLE departments (id int NOT NULL COMMENT ID,name varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_…

Centos7安装postgresql14步骤

1、进入网址 https://www.postgresql.org/download/ 2、按步骤执行 # Install the repository RPM: sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm# Install PostgreSQL: sudo yum install -y…

由于 Positive Technologies 的专业知识,Moxa 消除了工业无线转换器中的一个漏洞。

我们的专家在 NPort W2150A 和 W2250A 转换器中发现了该漏洞 - 这些设备可将工业控制器、仪表和传感器连接到本地 Wi-Fi 网络。Moxa 已根据负责任的披露政策通知了该威胁&#xff0c;并发布了软件更新。 &#x1f977; 攻击者可以完全访问这些设备。 Positive Technologies 公…

psutil, 一个超级有用的Python库

Python的psutil是一个跨平台的库&#xff0c;可以用于获取系统运行时的各种信息&#xff0c;包括CPU使用率、内存使用情况、磁盘和网络信息等。它主要用来做系统监控&#xff0c;性能分析&#xff0c;进程管理。它实现了同等命令行工具提供的功能&#xff0c;如ps、top、lsof、…

【前端】静态个人网站页面布局模板(附源码)

效果图 源码 <!DOCTYPE html> <html><head><style>* {box-sizing: border-box;}body {font-family: Arial;padding: 10px;background: #f1f1f1;}/* 页眉/Blog 标题 */.header {padding: 30px;text-align: center;background: white;}.header h1 {font…

【AnimateAnyone】定制化角色动画工具,让图片里的人物动起来!

论文地址&#xff1a;https://arxiv.org/pdf/2311.17117.pdf 项目地址&#xff1a;MooreThreads/Moore-AnimateAnyone (github.com) HumanAIGC/AnimateAnyone&#xff1a;Animate Anyone&#xff1a;用于角色动画的一致且可控的图像到视频合成 (github.com) 1. 模…

Docker容器常用命令笔记分享

Docker简介 Docker是一个开源的应用容器引擎&#xff0c;可以让开发者将应用程序及其依赖打包成一个可移植的容器&#xff0c;然后发布到任何支持Docker的机器上&#xff0c;实现应用程序在不同环境中的一致性运行。相比传统的虚拟化技术&#xff0c;Docker具有更轻量级、更快速…

【李沐论文精读】GPT、GPT-2和GPT-3论文精读

论文&#xff1a; GPT&#xff1a;Improving Language Understanding by Generative Pre-Training GTP-2&#xff1a;Language Models are Unsupervised Multitask Learners GPT-3&#xff1a;Language Models are Few-Shot Learners 参考&#xff1a;GPT、GPT-2、GPT-3论文精读…

计算机毕业设计 | SSM 在线毕业论文管理 线上考试成绩教务管理系统(附源码)

1&#xff0c; 绪论 研究背景 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于论文管理系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;首页、系统用户&#xff08;管理员、学生、老师&#xff09;模块管理&#xff08;指导教师、课…