【Java高级语法】(四)包装类:关于包装类的那些细节你都清楚吗?~

news2024/12/22 18:14:11

Java高级语法详解之包装类

  • :one: 概念
  • :two: 设计目的(作用)和用途
  • :three: 使用
    • 3.1 自动装箱与拆箱
    • 3.2 常用方法
    • 3.3 常用属性
    • 3.4 null和默认值
  • :four: 注意事项
  • :ear_of_rice: 总结
  • :bookmark_tabs: 本文源码下载地址

1️⃣ 概念

在Java编程中,包装类(Wrapper Class)是一种特殊的类,它们允许将基本数据类型包装(Wrap)成对象。每个原始数据类型都有对应的包装类,例如Integer对应整型,Double对应浮点型等。包装类提供了一些有用的方法和功能,方便我们操作和处理与原始数据类型相关的数据。

Java中的8个基本数据类型分别为booleanbyteshortintlongfloatdoublechar。每个基本数据类型都有相应的包装类,它们分别为:BooleanByteShortIntegerLongFloatDoubleCharacter

包装类是不可变的,即创建后不能修改其值。它们的对象可以通过构造函数或静态工厂方法来创建,并且提供了许多方法用于转换、比较和操作基本数据类型的值。

2️⃣ 设计目的(作用)和用途

包装类主要有以下几个设计目的和用途:

  • 将原始数据类型转化为对象类型: 用于支持面向对象编程。原始数据类型(如int、float等)在Java中是不具备面向对象特性的,不能直接作为对象在方法中传递或进行其他操作。包装类为每种原始数据类型提供了一个对应的对象类型,使得原始数据类型可以以对象的形式进行操作;

  • 实现与原始数据类型相关的功能: 包装类提供了一系列的方法,用于对原始数据类型及其对象进行常见操作,如转换、比较、计算等。这些方法往往在编程过程中非常有用,并且方便使用;

  • 泛型支持: 在需要引用类型而基本数据类型不可用的情况下使用。泛型只能接受引用类型作为参数,而不能直接使用原始数据类型。通过使用包装类,我们可以将原始数据类型作为对象传递给泛型类或方法;

  • null值表示缺失或特殊状态: 对于原始数据类型,没有办法表示一个缺失的值或特殊状态,因为它们是值类型而不是引用类型。包装类通过提供null值来表示缺失的值或特殊状态,例如在数据库中查询到的结果为空。

总之,包装类的设计使得原始数据类型可以以对象的形式出现,并提供了一些常用方法和功能来处理、操作和表示与原始数据类型相关的数据。

3️⃣ 使用

3.1 自动装箱与拆箱

在Java中,自动装箱(Autoboxing)指的是自动地将基本数据类型转换为对应的包装类对象;自动拆箱(Unboxing)则是将包装类对象自动转换为基本数据类型。

下面是一个简单的示例,展示了如何使用自动装箱与拆箱:

public class BoxingDemo {

    public static void main(String[] args) {
        // 自动装箱
        Integer num1 = 10; // 等价于 下面这行代码
        Integer num2 = Integer.valueOf(10);

        // 自动拆箱
        int num3 = num1; // 等价于 下面这行代码
        int num4 = num1.intValue();

        System.out.println(num1 == num2);
        System.out.println(num1.equals(num2));
        System.out.println(num3 == num4);
    }
}

在程序中,Integer num1 = 10; 这行代码,整数10被自动装箱成一个Integer对象,并赋值给变量num1。实际上,这行代码等价于 Integer num2 = Integer.valueOf(10); 使用了包装类的valueOf方法手动进行装箱。

int num3 = num1; 这行代码中,num1表示的Integer对象被自动拆箱为对应的基本数据类型int并赋值给num3。实际上,这行代码等价于 int num4 = num1.intValue(); 手动调用intValue方法进行拆箱。

接下来的三个输出语句用于比较两个对象的引用和值是否相等:

  • System.out.println(num1 == num2); 检查num1num2是否引用同一个对象。由于装箱操作时会缓存一定范围内的包装类对象,所以当数值范围在-128到127之间时,两个引用将指向同一个对象,输出结果为true。对于其他数值范围,不同的装箱操作将创建新的对象,输出结果为false
  • System.out.println(num1.equals(num2)); 使用equals方法检查num1num2的值是否相等。无论数值范围如何,此比较都会比较对象存储的数值,输出结果为true
  • System.out.println(num3 == num4); 检查num3num4的值是否相等。由于拆箱操作直接比较基本数据类型的值,输出结果为true

输出结果:

true
true
true

3.2 常用方法

包装类中的常见方法如下:

  • XXXValue() 方法:将包装类对象转换为相应的基本数据类型;
  • parseXXX(String s) 方法:将字符串转换为相应的基本数据类型;
  • toString() 方法:将包装类对象转换为字符串形式;
  • equals() 方法:比较两个包装类对象是否相等;
  • compare()方法:比较两个包装类对象的大小关系。若第一个对象小于第二个对象,则返回一个负数;若两个对象相等,则返回0;若第一个对象大于第二个对象,则返回一个正数;
  • valueOf() 方法:返回一个包含指定值的包装类对象。该方法是装箱的一种方式。

下面是一个简单的示例,展示了如何使用包装类中的这些常见方法:

public class MethodDemo {

    public static void main(String[] args) {
        // 使用intValue()方法将Integer转为int
        Integer number1 = new Integer(10);
        int value1 = number1.intValue();
        System.out.println("intValue(): " + value1);

        // 使用parseInt()方法将字符串转为int
        String str = "20";
        int value2 = Integer.parseInt(str);
        System.out.println("parseInt(): " + value2);

        // 使用toString()方法将int转为字符串
        int number3 = 30;
        String str2 = Integer.toString(number3);
        System.out.println("toString(): " + str2);

        // 使用equals()方法比较两个Integer对象是否相等
        Integer number4 = new Integer(40);
        Integer number5 = new Integer(40);
        boolean isEqual = number4.equals(number5);
        System.out.println("equals(): " + isEqual);

        // 使用compare()方法比较两个int值的大小
        int value3 = 50;
        int value4 = 60;
        int result = Integer.compare(value3, value4);
        System.out.println("compare(): " + result);

        // 使用valueOf()方法将int转为Integer对象
        int number6 = 70;
        Integer value5 = Integer.valueOf(number6);
        System.out.println("valueOf(): " + value5);
    }
}

输出结果:

intValue(): 10
parseInt(): 20
toString(): 30
equals(): true
compare(): -1
valueOf(): 70

3.3 常用属性

除了上述通用方法,每个包装类还提供了特定类型的方法和属性:

  • Integer类:
    • MAX_VALUE:表示整型的最大值;
    • MIN_VALUE:表示整型的最小值;
    • SIZE:表示整型的位数;
    • TYPE:表示数据类型的Class对象。
  • Double类:
    • MAX_VALUE:表示双精度浮点型的最大值;
    • MIN_VALUE:表示双精度浮点型的最小值;
    • NaN:表示非数字值;
    • POSITIVE_INFINITY:表示正无穷大;
    • NEGATIVE_INFINITY:表示负无穷大。
  • Character类:
    • MIN_VALUE:表示字符型的最小值;
    • MAX_VALUE:表示字符型的最大值;
    • TYPE:表示数据类型的Class对象。
  • Boolean类:
    • TRUE:表示真值;
    • FALSE:表示假值。

以上只是列举了常用的属性字段,并不是全部。每个包装类还提供其他方法和属性,具体可以参考相关文档及源码或查阅Java API文档以获得更详细的信息。

3.4 null和默认值

包装类可以具有null值,表示没有有效的值。这在需要处理可能不存在的值时非常有用。如果没有给包装类对象赋初始值,则它的默认值为null

下面是一个简单的示例,展示了包装类中的初始默认值:

public class DefaultValueDemo {

    public static void main(String[] args) {
        Integer num = null;
        System.out.println(num);

        Integer num2 = new Integer("1");
        System.out.println(num2);
    }
}
  • Integer num = null;: 这行代码声明了一个名为numInteger类型变量,并将其初始化为nullnull表示该变量当前不引用任何对象。
  • Integer num2 = new Integer("1");: 这行代码创建了一个名为num2Integer类型变量,并使用字符串"1"作为初始值来实例化它。通过将字符串转换为对应的整数值,num2将被赋值为整数1。

输出结果:

null
1

4️⃣ 注意事项

自动装箱与拆箱带来的性能问题:
虽然自动装箱和拆箱提供了简洁的代码,但在性能方面需要谨慎。由于装箱和拆箱操作涉及创建对象和类型转换,会带来额外的开销。因此,在处理大量数据时,使用基本数据类型可能更高效。

要规避包装类自动装箱和拆箱的性能问题,可以考虑以下几种方法:

  • 显式使用基本数据类型:尽量使用基本数据类型而不是对应的包装类。这样可以避免自动装箱和拆箱的开销;
  • 使用静态工厂方法创建包装类实例:在必须使用包装类时,可以使用静态工厂方法(如Integer.valueOf(int))来创建包装类的实例。静态工厂方法会经过一定的缓存优化,可以重用已有对象,减少对象的创建和销毁;
  • 使用原始类型数组:如果需要存储大量的基本数据类型,可以使用原始类型数组而不是包装类数组。原始类型数组效率更高,因为它们不会涉及到装箱和拆箱的操作;
  • 避免使用包装类进行运算: 避免使用包装类进行大量的数学运算,特别是在循环中进行运算。相比之下,使用基本数据类型可以获得更好的性能;
  • 使用第三方库:如果性能问题是严重的,可以考虑使用第三方库,如Trove或FastUtil,它们提供了基于原始类型的高性能集合类。

需要注意的是,自动装箱和拆箱的性能问题通常在处理大量数据时才会显著影响性能。对于一般的应用程序,这些性能差异可能不太明显,在编写代码时应根据具体情况权衡性能和可读性。

🌾 总结

总的来说,Java的包装类提供了将基本数据类型转换为对象的机制,并且提供了一些有用的方法和属性来处理这些封装后的值。这些包装类在编程中经常被使用,特别是在集合类框架和需要处理基本数据类型的情况下。

可以说包装类是一种强大的工具,它们在处理基本数据类型时提供了更多的灵活性和功能。掌握包装类及其相关知识对于开发Java应用程序非常重要,尤其是在处理用户输入、数据库操作和集合框架等方面。

但同时,在使用包装类时,需要注意自动装箱和拆箱带来的性能方面的问题,因为装箱和拆箱操作涉及创建对象和类型转换,会带来额外的开销。

📑 本文源码下载地址

Java语言 包装类讲解案例代码 ( 设计目的(作用)和用途、自动装箱与拆箱、常用方法、 null和默认值)
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

什么是TM的kotlin协程?就是靠 恢复和挂起,像同步一样写异步代码

作者:J船长 一、协程协程,恢复挂起,让异步像同步 重要的说三遍 协程协程,恢复挂起,让异步像同步协程协程,恢复挂起,让异步像同步协程协程,恢复挂起,让异步像同步 经常…

Apikit 自学日记:导入第三方产品 API 数据

除了手动创建API文档,系统也提供了一键导入 Swagger、Postman、RAP、YAPI 等产品数据的功能。方便从其他平台进行迁移。 产品支持度导入文件的后缀名Eolinker API 研发管理完全支持.jsonPostman V2.1支持导入API基础信息,超过10级分组的API数据将不会被导…

接口测试——接口测试文档

在执行接口测试前,测试人员肯定会先拿到开发给予的接口文档。测试人员可以根据这个文 档编写接口测试用例。所以,我们要先了解接口文档的主要构成及含义。 以购买开心产品项目接口文档为例,解析一下接口文档的组成。 完整的接口文档有公共信…

【VMD-DBO-LSTM】变分模态分解-蜣螂优化算法-长短时记忆神经网络研究(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

乐鑫 Thread 边界路由器解决方案

乐鑫科技 Thread 边界路由器 (Thread Border Router) 解决方案正式获得了由 Thread Group 颁发的 Thread Certified Component 证书,符合最新的 Thread 1.3 标准,并支持 Matter 应用场景。 本文将深入探讨该解决方案的技术细节和优势,以及如…

springboot+vue在线考试系统(java项目源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的在线考试系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风歌&a…

Unity编辑器扩展-第五集-撤回操作/禁止操作/加快捷键

第四集链接:Unity编辑器扩展-第四集-获取物体的方法_菌菌巧乐兹的博客-CSDN博客 一、本节目标效果展示 1.加入撤回操作 众所周知“撤回是ctrlz”,但如果你前几集仔细练习了,你会发现一个让你头痛不已的事情,用代码改的东西没法撤回。现在就…

JMeter如何和Charles进行接口测试

目录 一、什么是接口测试? 二、接口测试的好处 三、接口测试如何开展 四、如何使用JMeter 总结: 什么是接口测试,接口测试到底如何开展,我相信任何一个软件测试人员都会有这样的疑问, 这里我以接口测试自动化平台…

7.Sentinel控制台 配置 nacos持久化

一、Sentinel 持久化机制 推送模式说明优点缺点原始模式API将规则推送至客户端并直接更新到内存中,扩展写数据源简单、无任何依赖不保证一致性;规则保存在内存中,重启不建议用于生产环境PULL模式客户端主动向某个规则管理中心定期轮询拉取规则,<br />这个规则中心可以…

Discovery Holdings 探索没有复杂性的多云机会

开发新的产品和服务&#xff0c;让客户 “惊叹”&#xff0c;是业界一个一直以来的的承诺&#xff0c;尤其是在一个快节奏的数字世界。提供金融服务的公司面临着敏捷的金融科技公司的威胁和不断变化的客户期望的持续压力。为了保持领先地位&#xff0c;他们需要提供价值、自助服…

【送书福利-第十二期】前沿技术、人工智能、集成电路科学与芯片技术、新一代信息与通信技术、网络空间安全技术,四大热点领域热书!

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 本文目录 一、前言二、书籍介绍1、《Web3…

【夜深人静学数据结构与算法 | 第三篇】 二叉树

目录 前言&#xff1a; 二叉树&#xff1a; 二叉树的种类&#xff1a; 二叉树的存储方式&#xff1a; 1. 链式存储 2. 数组存储 二叉树的遍历方式 深度优先遍历 广度优先遍历 总结&#xff1a; 前言&#xff1a; 本文将会详细的介绍各种常见的树以及相对应的概念&…

iTOP-RK3588 | Linux系统和应用开发手册

iTOP -RK3588开发板使用手册上新&#xff0c;后续资料会不断更新&#xff0c;不断完善&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。 迅为RK3588开发板已经对Linux系统完成适配&#xff0c;同时新增了对应的文档教程辅助大家参考学习——《itop-3588开发板Linu…

戴着很舒服的蓝牙耳机推荐,佩戴舒适度高的蓝牙耳机分享

​无论是日常通勤还是运动健身&#xff0c;相信大多数朋友都喜欢一边在朝夕的奔波路上&#xff0c;或是休息锻炼的闲散时间中&#xff0c;一边听着好听的音乐营造一份轻松愉悦的氛围感来放松自己的心情。随着蓝牙耳机的增长和功能增加&#xff0c;很多用户找不到一款好用且适合…

从乐观到悲观:MySQL中不同类型的锁全面解析

大家好&#xff0c;我是你们的小米&#xff01;今天我要和大家分享关于MySQL的乐观锁和悲观锁&#xff0c;以及不同类型的锁。锁作为数据库中重要的概念之一&#xff0c;对于保证数据的一致性和并发性至关重要。现在就让我们一起来深入了解吧&#xff01; 为什么需要锁 在并发…

Android Compose UI实战练手----Google Bloom欢迎页

目录 1.概述2.效果图展示2.1 亮色主题效果&#xff1a;2.2 深色主题效果 3.项目结构解析3.1 颜色配置Color.kt3.2 形状配置Shape.kt3.3 主题配置Theme.kt3.4 字体配置 Type.kt 4.沉浸式状态栏适配5.UI界面分解及实现5.1 欢迎页背景内容5.2 欢迎页内容组件实现 5.3 欢迎页内容的…

自动化测试成熟度模型

目录 前言&#xff1a; 重新认识自动化测试 新手落地自动化测试 自动化测试成熟度模型 初级阶段-测试半自动化 中级阶段-回归测试自动化 高级阶段-大范围自动化测试 成熟阶段-自动化测试流水线 前言&#xff1a; 随着软件行业的快速发展&#xff0c;软件质量已经成为各…

chatgpt赋能python:Python如何绘制坐标轴

Python如何绘制坐标轴 在数据可视化中&#xff0c;坐标轴是一种非常常见的图形元素&#xff0c;其作用是让人们更好地理解和分析数据。在Python编程中&#xff0c;我们可以使用各种数据可视化库如Matplotlib和Seaborn来绘制坐标轴。本文将介绍如何使用Matplotlib库来绘制坐标轴…

17. 数据结构之图

前言 前面介绍了队列&#xff0c;栈等线性数据结构&#xff0c;二叉树&#xff0c;AVL树等非线性数据结构&#xff0c;本节&#xff0c;我们介绍一种新的非线性数据结构&#xff1a;图。图这种结构有很广泛的应用&#xff0c;比如社交网络&#xff0c;电子地图&#xff0c;多对…

【JVM篇】Java内存区域与OOM

目录 1、概述 2、运行时数据区域 3、程序计数器 4、Java虚拟机栈 5、本地方法栈 6、Java堆 7、方法区 8、运行时常量池 9、直接内存 1、概述 内存是非常重要的系统资源&#xff0c;是硬盘和 CPU 的中间仓库及桥梁&#xff0c;承载着操作系统和应用程序的实时运行。JVM…