[java]-包装类

学习目标

  1. 了解包装类是什么。
  2. 了解装箱和拆箱机制
  3. 自动装箱和自动拆箱

0.为什么要学习包装类?

在学习包装类之前,我们要了解包装类用来干什么?
前面提过的Java 8大数据类型(整型:byte ,short , int , long ;浮点型: float ,double;布尔类型:boolean ;字符型: char )。

  • 在面向对象编程
  1. Java 中的包装类 (Wrapper Classes) 是为了解决基本数据类型(如 int, char, double 等)不能直接作为对象使用的问题。
  2. 为引入泛型和后续集合框架(Java数据结构) 打基础。比如列表,集合,映。Java中一切皆对象的理念,从设计的角度来看,对象的引用可以提供更多的灵活性和功能,比如可以内置更多的常量属性和便捷的方法
  3. 前面1提过,这里具体说一下:由于包装类提供了许多实用的方法和属性,用于操作和处理基本数据类型。比如,valueOf方法,Integer类提供了将字符串转换为整数的方法,以及获取整数的最大值、最小值等属性。
  4. 支持null值:基本数据类型不支持null值,但在某些情况下,我们可能需要表示一个变量没有值。可以通过使用包装类,将引用设置为null来表示这种情况。
  5. Java泛型不支持基本数据类型。

一、包装类的定义概念

在Java中,基本类型不是类,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。
包装类。
int与char类型的包装类分别是Integer,Character。其余类型的包装类,类名是原基本数据类型关键字首字母大写。

包装类的使用

如果你不想关注包装类与基本数据类型内部的细节,你可以完全把包装类当成其基本数据类型使用。
包装类可以理解为升级版的基本数据类型,包装类与基本数据类型之间可以相互转换,且这种转换是自动的。

int a = 10;
Integer aObj = a;//等价Integer bObj = 20;
int b = bObj; //等价

关于泛型:
假设你要设计一个整型数组列表,ArrayList<int>是错误的写法,<>是泛型的写法,<>内只能传类,而不能是基本数据类型。
var list = new ArrayList<Integer>(),改成包装类就可以了。

二、包装类之间的继承关系

Java 中的包装类位于 java.lang 包中,并且它们都继承自 java.lang.Number 类(除了 Boolean 和 Character)。
具体包装类查阅文档

java.lang.Object├── java.lang.Number│     ├── java.lang.Byte│     ├── java.lang.Short│     ├── java.lang.Integer│     ├── java.lang.Long│     ├── java.lang.Float│     └── java.lang.Double├── java.lang.Character└── java.lang.Boolean

简单说明Number类,它是一个抽象类,Number类是所有包装类的父类(除了 Boolean 和 Character)。
Number类提供了将包装类转换为基本数据类型的方法,如intValue()、doubleValue()等。这些方法是由子类实现,作用是将包装类转化成对应的基本数据类型。

三、装箱与拆箱

int 与 Integer怎么转换呢?

Integer integer = new Integer(1),对于类实例化对象,你可能比较熟悉了。
但事实上只需Integer integer = 1;Java底层设计,我们对于包装类不需要调用方法来手动转化,而是把它交给虚拟机操心。
先说明两个概念:

  1. 自动装箱:将基本数据类型转换为包装类。
  2. 自动拆箱:将包装类转换为基本数据类型。
    Java虚拟机在运行时,会自动将基本数据类型转换为对应的包装类,这个过程称为自动装箱。同样地,Java虚拟机也会自动将包装类转换为基本数据类型,这个过程称为自动拆箱。
    尝试一下手动装箱吧。
    基本数据类型转包装类,采用的valueOf静态方法方法,而不是构造器(该方法已不推荐使用)。
int x = 10;
Integer y = Integer.valueOf(x);

包装类转基本数据类型,采用intValue()方法。

Integer x = 10;
int y = x.intValue();
//int y = (int)x; // 也可以类型转换写。
使用过程中,手动装箱和拆箱带来不少的代码量,所以为了减少开发者的负担,java 提供了自动机制。
我们没必要手动装箱和拆箱,java 虚拟机会自动帮我们完成,所以只是了解一些JVM在这个过程实际上帮我们调用了这些方法。## 包装类与基本数据类型的区别
你知道包装类是对象,基本数据类型是值。
但好像实际体验看包装类也可以完全充当基本数据类型啊。
```java
Integer a = 10;
Integer b = 10;
System.out.println(a == b); Integer c = 1000;
Integer d = 1000;
System.out.println(c == d); 

输出结果:

true
false

为什么会出现这种情况呢?
这是因为Java在处理包装类时,有一个缓存机制。对于-128到127之间的整数,Java会缓存这些整数对应的包装类对象,当创建一个在这个范围内的整数包装类对象时,Java会直接返回缓存中的对象,而不是创建一个新的对象。这就是为什么a和b是相等的,因为它们引用的是同一个对象。而对于1000,Java不会缓存这个值对应的包装类对象,所以c和d引用的是不同的对象,所以它们不相等。

//java17,Integer类@IntrinsicCandidatepublic static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}

// IntegerCache是Integer类的一个内部类,它定义了两个静态变量low和high,分别表示缓存中最小值(-128)和最大值(127)。
static final Integer[] cache;
// cache数组用于存储缓存中的包装类对象,数组长度为256,即缓存了-128到127之间的整数对应的包装类对象。这些对象在静态区创建好了,这个范围内的数只需返回缓存中的对象即可,而不在这个范围内的数则直接创建新的对象。否则则要直接new一个对象。
结论:包装类是对象,符合缓存区的int数据,会让它们引用一个同一个静态区的对象,否则则创建新的对象。这就是上面true和false的原因。

遇事不决翻源码文档·和问ChatGpt。

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

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

相关文章

深入探索Flutter中的状态管理:使用Provider库

当涉及Flutter状态管理时,provider是一个强大且灵活的解决方案,它提供了一种简单且高效的方式来管理应用程序状态。本文将详细介绍Flutter中provider插件的使用方法、示例代码、各种使用场景以及注意事项。 1. 引入依赖 首先,需要在项目的pubspec.yaml文件中添加provider依…

Servlet运行过程

Servlet运行过程 Servlet程序是由WEB服务器调用&#xff0c;web服务器收到客户端的Servlet访问请求后&#xff1a; ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是&#xff0c;则直接执行第④步&#xff0c;否则执行第②步。 ②装载并创建该Servlet的…

AI测试入门(1):认识AI大语言模型(LLM)

AI测试入门&#xff08;1&#xff09;&#xff1a;认识AI大语言模型&#xff08;LLM&#xff09; 前言一、大语言模型的概述1. 什么是大语言模型&#xff1f;2. 大语言模型的历史发展 二、大语言模型的工作原理1. Transformer架构自注意力机制 2. 预训练与微调预训练微调 三、大…

超声波清洗机哪款好用?保姆级教学,教你手把手挑选适合自己的超声波清洗机

提及超声波清洗机&#xff0c;大家都不陌生&#xff0c;尤其是佩戴眼镜的小伙伴&#xff0c;眼镜的镜片长时间不清洁容易模糊不清&#xff0c;而超声波清洗机的出现&#xff0c;可以轻松清洗还不会损坏镜片&#xff0c;备受眼镜党喜爱。但由于现在市面上的超声波清洗机的款式太…

pyqt/pyside QTableWidget失去焦点后,选中的行仍高亮的显示

正常情况下pyqt/pyside的QTableWidget&#xff0c;点击input或者按钮失去焦点后 行的颜色消失了 如何在失去焦点时保持行的选中颜色&#xff0c;增加下面的代码&#xff1a; # 获取当前表格部件的调色板 p tableWidget.palette()# 获取活跃状态下的高亮颜色和高亮文本颜色&a…

排序系列 之 插入排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦 介绍 插入排序英文名为InsertSort 基本思路 1、认为数组当中的第一个数值已经排好序了2、定义一个游标从第二个数值开始不断地向后进行遍历3、游标指向的数据插入已经排好序的数组中 代码…

安卓自带camera hal3 实例README.md翻译

最近&#xff0c;遇到一个这样的问题&#xff0c;临时了解下这个驱动实现架构和特点&#xff0c;翻译如下 V4L2相机HALv3 camera.v4l2库使用视频Linux 2&#xff08;V4L2&#xff09;接口实现了camera HAL v3。这使得它在理论上可以与各种设备配合使用&#xff0c;尽管V4L2的…

Windows server漏洞解决

Windows server漏洞解决 一、SSL/TLS问题1、问题2、建议3、方法1)、winR运行&#xff1a;regedit&#xff0c;进入注册表。2&#xff09;、找到注册表3&#xff09;、在Ciphers新建五个项4&#xff09;、在每个新建文件加入值 二、Apache Tomcat问题1、问题2、下载 好家伙&…

国内从事双臂机器人的团队

一、背景 随着人形机器人的发展&#xff0c;双臂协同操作得到了越来越多研究人员的关注。我自己也是做双臂机器人方向的&#xff0c;虽然通过看论文或刷知乎了解到国内有许多团队在做双臂机器人方向&#xff0c;但还没有系统的整理过&#xff0c;因此趁这次机会&#xff0c;好…

Stripe web 支付语言设置

在两个地方都可以设置 VALUELOCALEELEMENTSCHECKOUTautoStripe detects the locale of the browser✔✔arArabic✔bgBulgarian (Bulgaria)✔✔csCzech (Czech Republic)✔✔daDanish (Denmark)✔✔deGerman (Germany)✔✔elGreek (Greece)✔✔enEnglish✔✔en-GBEnglish (Unit…

python的mixin设计模式

1.介绍 在 Python 中&#xff0c;mixin 是一种设计模式&#xff0c;它是一个包含了特定功能单元的类&#xff0c;这些功能可以被其他类组合利用&#xff0c;这些功能可以被其他类组合利用&#xff0c;以实现代码的复用和功能扩展。 mixin 类通常不被单独实例化&#xff0c;也不…

agv叉车slam定位精度测试标准化流程

相对定位精度 条件&#xff1a;1.5m/s最高速度&#xff1b;基于普通直行任务 数据采集&#xff08;3个不同位置的直行任务&#xff0c;每个任务直行约10m&#xff0c;每个10次&#xff09; 测量每次走过的实际距离&#xff0c;与每次根据定位结果算得的相对距离&#xff0c;两…

Python_封装和继承

封装 Python的封装是一种将数据&#xff08;属性&#xff09;和行为&#xff08;方法&#xff09;捆绑在一起的操作&#xff0c;以实现数据隐藏和抽象。 封装的目的是保护对象内部的数据不被外部直接访问和修改&#xff0c;同时提供接口与外界交互。 私有属性&#xff1a;在…

ES6 数组的扩展(十六)

1. Array.from() 特性&#xff1a;从类数组对象或可迭代对象中创建一个新的数组实例。 用法&#xff1a;将类数组对象或可迭代对象转换为数组。 const likeArray { 0: a, 1: b, length: 2 }; const arr Array.from(likeArray); console.log(arr); // 输出&#xff1a;[a, b…

C#数字医学影像系统(RIS/PACS)源码,Oracle数据库,C/S架构,运行稳定

数字医学影像系统&#xff08;RIS/PACS&#xff09;源码&#xff0c;三甲以下的医院都能满足。PACS 系统全套成品源码。 开发技术&#xff1a;C/S架构&#xff0c;C#开发语言&#xff0c;数据库服务器采用Oracle数据库。 医学影像存储与传输系统&#xff0c;融合了医学信息化…

算法-经典递归解决排列组合

文章目录 前言1. 获取字符串的所有字串2. 数组的子集(无重复)3. 数组的子集(有重复)4. 字符大小写全排列5. 全排列(无重复)6. 全排列(有重复) 前言 如何正确的处理递归 所有的递归都分为带路径的递归和不带路径的递归, 我们之前学二叉树的时候基本上都是带路径的递归, 所有的递…

HBuilder x 使用Git管理项目,配合easy-git插件管理项目代码配置git和推送/拉取使用教程

文章目录 目录 文章目录 使用流程 小结 概要安装流程技术细节小结 概要 克隆/拉取项目代码到本地电脑教程 HBuilder x 使用Git管理项目&#xff0c;配合easy-git插件 克隆项目代码到本地教程-CSDN博客 电脑环境已安装好Hbuilder x工具 如果没有安装可以参考以下先安装好Hbui…

MATLAB6:M文件和控制流

文章目录 一、实验目的二、实验内容三、仿真结果四、实践中遇到的问题及解决方法 一、实验目的 1. 熟悉运用MATLAB的控制指令。   2. 理解M脚本文件和函数文件的本质区别。   3. 能够运用所学知识&#xff0c;编制程序解决一般的计算问题。 二、实验内容 1.for循环结构及注…

银发经济发展需要什么支持

随着社会老龄化的加剧&#xff0c;“银发经济”应运而生&#xff0c;成为社会发展的新动向。银发经济指的是针对老年人群体的经济活动&#xff0c;包括健康护理、休闲旅游、教育文化等多方面内容。这一现象不仅体现了社会对老年群体的关注和尊重&#xff0c;同时也为经济发展提…

python selenium4 EdgeDriver动态页面爬取

截止至2024.7.16 chrome浏览器最新版本为126.0.6478.127 但对应的chromeDriver版本都低于此版本&#xff0c;因此&#xff0c;转用Edge浏览器 说明&#xff1a;仅记录自己使用过程中用到的一些代码和感受&#xff0c;看具体情况不定期更新。 selenium官方文档 1、安装selen…