深入解析Java数据包装类型:特性、机制与最佳实践
文章目录
- 1. 基本概念
- 2. 自动装箱与拆箱
- 3. 缓存机制
- 4. 不可变性
- 5. 常见陷阱与最佳实践
- a. 空指针异常
- b. 不要用 `==` 比较两个包装类实例
- c. 高精度计算
- d. 字符串解析
- 总结
1. 基本概念
Java提供了每个基本数据类型的包装类,位于java.lang包中。这些包装类允许我们将基本数据类型作为对象处理,从而在需要面向对象功能的地方(如集合框架、泛型编程)非常有用。
2. 自动装箱与拆箱
public class AutoBoxingUnboxing {public static void main(String[] args) {// 自动装箱Integer num = 42; // int -> Integer// 自动拆箱int value = num; // Integer -> int// 使用包装类进行数学运算(会自动拆箱)Integer sum = num + 5;System.out.println("num: " + num);System.out.println("value: " + value);System.out.println("sum: " + sum);}
}
3. 缓存机制
某些包装类(如Integer)对特定范围内的值实现了缓存,默认为-128到127之间的值。这意味着在这个范围内的值使用 valueOf() 方法时不会创建新的对象。
public class CacheMechanism {public static void main(String[] args) {// 缓存范围内的值比较Integer i1 = Integer.valueOf(100); // -128 <= 100 <= 127Integer i2 = Integer.valueOf(100); // -128 <= 100 <= 127System.out.println(i1 == i2); // true,因为它们引用同一个对象// 超出缓存范围的值比较Integer i3 = Integer.valueOf(300); // 300 > 127Integer i4 = Integer.valueOf(300); // 300 > 127System.out.println(i3 == i4); // false,因为它们引用不同的对象}
}
4. 不可变性
所有包装类都是不可变的,一旦创建后其内部状态不能被修改。如果需要改变值,必须创建新的对象。
public class ImmutabilityExample {public static void main(String[] args) {Integer immutableInt = Integer.valueOf(42);// 如果需要改变值,必须创建新的对象Integer newInt = immutableInt + 1;System.out.println("Original: " + immutableInt); // 输出42System.out.println("New: " + newInt); // 输出43}
}
5. 常见陷阱与最佳实践
a. 空指针异常
在拆箱操作中如果包装类实例为 null,则会抛出 NullPointerException。
public class NullPointerTrap {public static void main(String[] args) {Integer nullableInt = null;try {int value = nullableInt; // 这里会抛出 NullPointerException} catch (NullPointerException e) {System.out.println("Caught NullPointerException");}}
}
b. 不要用 == 比较两个包装类实例
应该使用 equals() 或者对于数字类型的包装类可以使用 compareTo() 方法。
public class ComparisonTrap {public static void main(String[] args) {Integer i1 = new Integer(100);Integer i2 = new Integer(100);// 错误的做法:使用 == 比较对象引用System.out.println(i1 == i2); // 可能输出false// 正确的做法:使用 equals() 比较值System.out.println(i1.equals(i2)); // 输出true// 对于数字类型的包装类,也可以使用 compareTo()System.out.println(i1.compareTo(i2) == 0); // 输出true}
}
c. 高精度计算
对于需要高精度的计算,推荐使用 BigDecimal 来避免浮点数精度丢失的问题。
import java.math.BigDecimal;public class HighPrecisionCalculation {public static void main(String[] args) {BigDecimal preciseValue = new BigDecimal("0.1");BigDecimal result = preciseValue.multiply(new BigDecimal("3"));System.out.println("Precise result: " + result); // 输出0.3// 浮点数可能有精度问题double impreciseValue = 0.1;double impreciseResult = impreciseValue * 3;System.out.println("Imprecise result: " + impreciseResult); // 输出0.30000000000000004}
}
d. 字符串解析
处理可能抛出的 NumberFormatException,确保输入格式正确。
public class StringParsing {public static void main(String[] args) {try {int number = Integer.parseInt("123abc"); // 这里会抛出 NumberFormatException} catch (NumberFormatException e) {System.out.println("Invalid number format");}// 成功解析try {int number = Integer.parseInt("123");System.out.println("Parsed number: " + number);} catch (NumberFormatException e) {System.out.println("Invalid number format");}}
}
总结
通过上述代码示例,我们综合了Java数据包装类型的关键特性,包括:
- 自动装箱与拆箱:简化了基本数据类型与对象之间的转换。
- 缓存机制:提高了性能并减少了内存占用。
- 不可变性:保证了线程安全性和共享安全性。
- 常见陷阱与最佳实践:避免了常见的错误,如空指针异常、不正确的比较方式、浮点数精度丢失以及字符串解析失败。
相关文章:
深入解析Java数据包装类型:特性、机制与最佳实践
文章目录 1. 基本概念2. 自动装箱与拆箱3. 缓存机制4. 不可变性5. 常见陷阱与最佳实践a. 空指针异常b. 不要用 比较两个包装类实例c. 高精度计算d. 字符串解析 总结 1. 基本概念 Java提供了每个基本数据类型的包装类,位于java.lang包中。这些包装类允许我们将基本…...
【Java基础入门篇】二、控制语句和递归算法
Java基础入门篇 二、控制语句和递归算法 2.1 switch-case多分支选择语句 switch执行case语句块时,若没有遇到break,则运行下一个case直到遇到break,最后的default表示当没有case与之匹配时,默认执行的内容,代码示例如…...
PostgreSQL WAL日志膨胀处理
作者:Digital Observer(施嘉伟) Oracle ACE Pro: Database PostgreSQL ACE Partner 11年数据库行业经验,现主要从事数据库服务工作 拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、P…...
用户该怎么管理维护自己的服务器?
管理和维护自己的服务器是确保其长期稳定、高效和安全运行的重要任务。以下是一些关键的服务器管理和维护的步骤和建议,适用于Linux或Windows服务器。 1.定期备份数据 定期备份是防止数据丢失和恢复故障的关键步骤。备份策略应包括: 全量备份:…...
【MYSQL数据库相关知识介绍】
MySQL 在我们日常技术中是一个广泛使用的开源关系型数据库管理系统,所以作为测试同学,掌握mysql的相关知识是必不可少的技能之一,所以小编从软件测试的角色出发,来整理一些跟测试相关的知识,希望能够帮助到大家。 一、…...
初窥 HTTP 缓存
引言 对于前端来说, 你肯定听说过 HTTP 缓存。 当然不管你知不知道它, 对于提高网站性能和用户体验, 它都扮演着重要的角色! 它通过在客户端和服务器之间存储和重用先前获取的资源副本, 来减少网络流量和降低资源加载时间, 从而提升用户体验! 以下是 HTTP 缓存的重要性: 减少…...
yolov8的深度学习环境安装(cuda12.4、ubuntu22.04)
目录 一、先安装基础环境包 1.首先给Ubuntu安装Chrome浏览器(搜索引擎换成百度即可) 2、ubuntu 22.04中文输入法安装 3、安装 terminator 4、安装WPS for Linux 5、安装其它之前需要先安装anaconda 6、安装配置anaconda 7、安装完成anaconda后创建…...
RSA算法和AES算法,哪种更安全
目录 一、RSA (非对称加密算法) 二、AES (对称加密算法) 三、对比总结 四、更安全的选择 五、结合使用:RSA AES RSA 和 AES 是两种不同类型的加密算法,适用于不同的场景,因此它们的安全性不能直接比较,而是取决于具体的应用…...
Vue教程|搭建vue项目|Vue-CLI新版脚手架
一、安装Node环境 安装Node及Npm环境 Node下载地址:Node.js — Run JavaScript EverywhereNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en/ 安装完成后,检查安装是否成功,并检查版本,命令如下: node -v npm -v mac@Macd…...
kdump调试分析(适用于麒麟,ubuntu等OS)
1. kdump基本原理 1.1 内核崩溃处理机制 当 Linux 系统内核发生崩溃时,通常会触发 panic,系统停止正常运行。Kdump 在这种情况下: 使用一个备用的内核(称为 crash kernel)来启动最小化的环境。从崩溃的主内核中复制内存内容(转储文件)。将转储文件保存到预定义的存储位…...
houdini肌肉刷pin点的方法
目标:产生gluetoanimation这个属性 主要节点:attribute paint(或者muscle paint) 步骤1: 导入肌肉资产 导入的是rest shape的肌肉 在有侧边栏可以打开display group and attribute list,方便查看group。不同的肌肉块按照muscl…...
JMeter 并发策略-针对准点秒杀场景的压测实现
一、场景的压测实现 1,创建线程组,10并发用户执行5次; 2,创建 Synchronizing Timer 元件,用于同步线程,设置同步元件 Synchronizing Timer 3,创建 http 请求4,创建 view results in table 元件…...
龙迅#LT6912适用于HDMI2.0转HDMI+LVDS/MIPI,分辨率高达4K60HZ,支持音频和HDCP2.2
1. 描述 LT6912是一款高性能的HDMI2.0转HDMI和LVDS和MIPI转换器。 HDMI2.0 输入和输出均支持高达 6Gbps 的数据速率,为4k60Hz视频提供足够的带宽。此外,还支持 HDCP2.2 进行数据解密(无数据 加密)。 对于 LVDS 输出,…...
RBF神经网络预测结合NSGAII多目标优化
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 RBF神经网络预测结合NSGAII多目标优化 rbf神经网络预测结合nsga2多目标优化 题外话: 多目标优化是指在优化问题中同时考虑多个目标函数的优化过程。在多目标优化中,通常存在多个冲突的目标&am…...
如何看linux系统内核是aarch64 ,还是64-bit
要查看 Linux 系统内核是 aarch64 架构还是 64-bit 架构,可以通过以下几种方法来确认: 方法 1:使用 uname 命令 uname 命令用于显示系统信息。使用以下命令查看系统的架构: uname -m如果输出是 aarch64,说明你的系统…...
如何通过 ADB 安装 xapk
Android开发这么久,今天发现还能这么操作!😂 记录通过ADB安装xapk、apks的两种方式: 1.ADB命令安装使用APK-Splits技术分包的应用程序 这位大佬的方式步骤较为繁琐,不过兼容性应该较好,亲测成功安装。 2.How to install xapk, apks, or multiple-apks via adb? 这个…...
QT:多ui界面显示
文章目录 1.多ui界面添加2.跳转函数3.返回函数4.Qt5源码工程5.模态显示 1.多ui界面添加 最终生成这个目录 2.跳转函数 void MainWindow::on_pushButton_clicked() {//this->setWindowModality(Qt::WindowModal);test1 *t1 new test1();t1->setParentData(this);this-…...
redis cluster 3主3从部署方案
文章目录 1 Redis Cluster 介绍1 Redis cluster 架构2 Redis cluster的工作原理2.1 数据分区2.2 集群通信2.3 集群伸缩2.3.1 集群扩容2.3.2 集群缩容 2.4 故障转移2.4.1 主观下线2.4.2 客观下线 3 Redis Cluster 部署架构说明3.1 部署方式介绍3.2 实战案例:基于Redi…...
前端学习笔记之文件下载(1.0)
因为要用到这样一个场景,需要下载系统的使用教程,所以在前端项目中就提供了一个能够下载系统教程的一个按钮,供使用者进行下载。 所以就试着写一下这个功能,以一个demo的形式进行演示,在学习的过程中也发现了中文路径…...
从技术视角看AI在Facebook全球化中的作用
在全球化日益加深的今天,人工智能(AI)作为一种变革性技术,正在深刻影响全球互联网巨头的发展方向。Facebook作为全球最大的社交媒体平台之一,正通过AI技术突破语言、文化和技术的障碍,推动全球化战略的实现…...
大语言模型越狱攻防全景:从对抗攻击到安全防御实践
1. 项目概述与核心价值如果你正在研究或部署大语言模型,那么“越狱”这个词你一定不陌生。它指的是通过各种技术手段,诱导或迫使一个经过安全对齐的模型,输出其原本被禁止生成的内容,比如有害信息、隐私数据或违反其使用政策的回答…...
S2C如何以FPGA原型验证方案破解中国芯片设计团队的验证痛点
1. 从EDA巨头东迁,看一个被忽视的蓝海市场最近业内有个不大不小的新闻,Altium这家知名的电子设计自动化(EDA)公司把总部搬到了中国。这事儿引起了不少讨论,但说实话,它既不是第一个这么干的,也未…...
别再死记硬背截止、放大、饱和了!用Arduino+面包板,5分钟直观演示三极管三种工作状态
用Arduino实战破解三极管工作状态的秘密 记得第一次学三极管时,盯着课本上那些截止区、放大区、饱和区的曲线图,我完全无法理解这些抽象概念和实际电路有什么关系。直到有一天,我在实验室里用Arduino和几个简单元件搭建了一个测试电路&#x…...
十分钟速通:GO、KEGG、COG注释与富集分析的实战指南
1. 从测序数据到功能注释的快速通道 刚拿到高通量测序数据的同学,面对海量基因序列时总会陷入迷茫:这些基因到底有什么功能?它们参与了哪些生物过程?这时候GO、KEGG和COG三大注释工具就是你的"基因翻译官"。我处理过上百…...
基于大语言模型的网页自动化智能体:Elsa OpenClaw 实战指南
1. 项目概述与核心价值 最近在折腾一些自动化流程,发现很多重复性的网页操作,比如数据抓取、表单填写、状态监控,手动来做不仅耗时,还容易出错。于是我开始寻找一个能真正理解网页结构、像人一样操作浏览器的工具。市面上有不少自…...
别再写面条代码了!用C语言状态机重构你的单片机项目(附51单片机HSM可移植框架)
从面条代码到优雅架构:用HSM状态机重构嵌入式系统的实战指南 当你面对一个智能家居设备的嵌入式项目,代码里充斥着数百行的if-else嵌套和switch-case分支,每次添加新功能都像是在一碗已经坨掉的面条上再浇一勺酱料——这样的开发体验…...
004 LVGL应用场景与案例概览
004 LVGL应用场景与案例概览 上周帮一个做智能家居的朋友调屏,他用的STM32F407+4.3寸RGB屏,LVGL跑得挺欢,但一加上WiFi联网和MQTT协议栈,屏幕刷新就开始卡顿,触摸响应延迟明显。我打开他的代码一看,好家伙,lv_task_handler()直接放在主循环里裸奔,没有任何优先级管理。…...
ComfyUI-Impact-Pack完整安装指南:为什么你的V8版本功能不全?终极解决方案
ComfyUI-Impact-Pack完整安装指南:为什么你的V8版本功能不全?终极解决方案 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, …...
戴尔G15终极散热解决方案:TCC-G15完整使用指南
戴尔G15终极散热解决方案:TCC-G15完整使用指南 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 还在为戴尔G15笔记本的高温问题而烦恼吗?…...
为什么92%的AI创作者不敢打印自己的Midjourney作品?揭秘树莓派印相避坑指南,含色彩管理ICC配置包(限免72小时)
更多请点击: https://intelliparadigm.com 第一章:为什么92%的AI创作者不敢打印自己的Midjourney作品? 当一张由 Midjourney 生成的「超写实森林神殿」在屏幕上熠熠生辉时,创作者往往兴奋地截图、转发、设为壁纸——却极少有人按…...
