Java基本数据类型、包装类及拆装箱详解

news2024/11/19 8:29:48

Java的基本数据类型和对应的包装类是Java语言中处理数据的两个关键概念。基本数据类型提供了简单而高效的方式来存储数据,而包装类使得基本数据类型具有对象的特性。本文将深入探讨基本数据类型与包装类的应用场景及详细描述,并对自动拆箱和装箱的源码实现进行分析。

Java.jpg

基本数据类型与包装类的详解及应用场景

详细对应关系如下:

基本类型包装类型占用空间范围基本类型默认值分类
byteByte1个字节 − 2 7 -2^7 27~ 2 7 − 1 2^7-1 2710整型
shortShort2个字节 − 2 15 -2^{15} 215~ 2 15 − 1 2^{15} -1 21510整型
intInteger4个字节 − 2 31 -2^{31} 231~ 2 31 − 1 2^{31} -1 23110整型
longLong8个字节 − 2 63 -2^{63} 263~ 2 63 − 1 2^{63} -1 26310整型
floatFloat4个字节1.4E-45~3.4028235E380.0浮点型
doubleDouble8个字节4.9E-324~1.7976931348623157E3080.0浮点型
charCharacter2个字节‘\u0000’~‘\uffff’‘\u0000’ 0字符型
booleanBoolean1个字节true/falsefalse布尔型

基本数据类型

Java的基本数据类型包括byte、short、int、long、float、double、char和boolean。它们是存储简单数据的理想选择,具有较低的内存占用和更高的性能。基本数据类型通常在以下场景中被广泛应用:

  • 数值计算:基本数据类型在数值计算场景中表现出色,例如在科学计算、图形处理等领域。
  • 数组操作:基本数据类型在数组和集合的存储中更为高效,适用于需要大量数据存储的场景。
  • 原始数据表示:基本数据类型是存储原始数据的首选方式,对于一些简单的数据结构,如位运算、枚举等,基本数据类型更为直观和高效。

包装类

Java的包装类,即Byte、Short、Integer、Long、Float、Double、Character和Boolean,为基本数据类型提供了对象封装。包装类的应用场景主要包括:

  • 集合类使用:集合类(如List、Map等)只能存储对象,而基本数据类型需要通过包装类来转换为对象才能存储在集合中。
  • 泛型使用:泛型不能直接使用基本数据类型,而包装类可以作为泛型的类型参数,使得泛型在处理数据时更为灵活。
  • 数据结构:在一些数据结构的实现中,需要使用包装类来处理一些特殊的数据情况。

基本数据类型与包装类的区别

基本数据类型和包装类在Java中有一些重要的区别,涵盖了创建方式、存储方式、默认值等多个方面。以下是它们的主要区别:

  • 创建方式

基本数据类型: 可以通过直接声明变量并赋值来创建基本数据类型的变量;

包装类:包装类是引用类型,因此可以使用关键字 new 实例化对象,也可以使用自动装箱(Autoboxing)进行自动转换。例如:

Integer integerObj = new Integer(42); // 使用 new 实例化
Integer intObj = new 42; // 自动装箱
Double doubleObj = 3.14; // 自动装箱
  • 存储方式

基本数据类型: 直接存储数值,占用较小的内存空间,存储在栈上。

包装类: 存储在堆上,由于是对象,占用的内存空间相对较大,同时需要考虑垃圾回收等额外的开销。

  • 默认值

基本数据类型: 如果在声明时未赋值,基本数据类型会有默认值,默认值查看详细关系表格。

包装类: 如果在声明时未赋值,包装类会默认为 null。因为包装类是引用类型,而引用类型的默认值是 null。

自动装箱和拆箱

自动装箱(Autoboxing)

自动装箱是指将基本数据类型自动转换为对应的包装类。以Integer为例,当执行Integer i = 42;时,实际上会调用Integer.valueOf(42)。下面是Integer.valueOf方法的源码:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

在这里,IntegerCache是一个内部静态类,用于缓存范围内的Integer对象,以提高性能。如果值在缓存范围内,直接返回缓存中的对象,否则创建一个新的Integer对象。

自动拆箱(Unboxing)

自动拆箱是指将包装类自动转换为对应的基本数据类型。以Integer为例,当执行int i = integerObject;时,实际上会调用integerObject.intValue()。下面是intValue方法的源码:

public int intValue() {
    return value;
}

在这里,value是Integer对象中存储的基本类型值。

自动拆装箱反编译代码

例如如下java代码:

public class Test {
    public static void main(String[] args) {
        //自动装箱
        int intVal = 2;
        Integer integerObj = intVal;
        //自动拆箱
        Integer integerObj1 = Integer.valueOf(4);
        int intVal1 = integerObj1;
        System.out.println("integerObj:"+integerObj+";intVal1:"+intVal1);
    }
}

我们可以看到反编译后的代码如下:

public class Test
{
  public static void main(String[] args)
  {
    int intVal = 2;
    Integer integerObj = Integer.valueOf(intVal);

    Integer integerObj1 = Integer.valueOf(4);
    int intVal1 = integerObj1.intValue();
    System.out.println("integerObj:" + integerObj + ";intVal1:" + intVal1);
  }
}

通过反编译后的代码我们可以看到它拆装箱其实是调用了valueOf()和intValue()的实现自动拆装箱的

自动拆装箱使用场景

以下是一些使用自动拆装箱的常见场景

  • 集合框架

在集合类中,通常要求存储对象而不是基本数据类型。使用自动装箱,可以将基本数据类型直接放入集合中,而在获取元素时会自动进行拆箱。

List<Integer> integerList = new ArrayList<>();
integerList.add(2);  // 自动装箱
int value = integerList.get(0);  // 自动拆箱
  • 泛型

泛型在定义时需要指定引用类型,而不能使用基本数据类型。通过自动装箱和拆箱,可以在泛型中直接使用基本数据类型。

List<Integer> integerList = new ArrayList<>();
integerList.add(2);  // 自动装箱
int value = integerList.get(0);  // 自动拆箱
  • 方法参数传递

在方法的参数列表和返回值中,可以直接使用基本数据类型,而方法的实现中会自动进行拆箱和装箱。

public void processInteger(Integer value) {
    // 自动拆箱
    int result = value + 10;
    System.out.println(result);
}

public Integer getInteger() {
    // 自动装箱
    return 42;
}
  • 比较操作

在比较操作中,可以直接比较基本数据类型的值,而不必显式地进行拆箱

Integer a = 42;
int b = 42;
if (a == b) {
    // 自动拆箱
    System.out.println("Equal");
}
  • 数组列表的排序

使用 Collections.sort 对包含基本数据类型的包装类对象的列表进行排序。

List<Integer> integerList = new ArrayList<>();
integerList.add(3);
integerList.add(1);
integerList.add(2);

Collections.sort(integerList);  // 自动拆箱和装箱

这些场景中,自动拆装箱的机制简化了代码,提高了代码的可读性和编写效率。但需要注意,频繁的自动拆装箱操作可能会带来一些性能开销,特别是在性能敏感的代码中,需要谨慎使用。

总结

通过本文的详细解析,我们深入了解了Java基本数据类型和包装类的应用场景、特性,并通过源码分析了自动拆箱和装箱的实现原理。在实际开发中,理解这些概念和机制将帮助我们更好地选择合适的数据类型,并优雅地处理基本数据类型与包装类之间的转换。这对于构建性能高效、可维护的Java应用程序至关重要。但需要注意,频繁的自动拆装箱操作可能会带来一些性能开销,特别是在性能敏感的代码中,需要谨慎使用。

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

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

相关文章

【信息安全】MD5哈希函数

1. MD5介绍 MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种常见的哈希函数&#xff0c;通常用于产生数据的数字摘要&#xff0c;也称为哈希值或摘要值。它是由Ron Rivest在1991年设计的&#xff0c;广泛用于数据完整性验证、密码存储、数字签名等领域。 MD5哈…

HTML CSS JavaScript的网页设计

一、网页界面效果&#xff1a; 二、HTML代码&#xff1a; <!DOCTYPE html> <!-- 声明文档类型--> <html lang"en"> …

如何定位当生产环境CPU飙升的时候的问题

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、排查思路 二、预防CPU飙升 三、总结 前言 在当今的信息化时代&#xff0c;计算机系统在各行各业都发挥着重要的作用。然而&a…

Java中实用的策略模式【Strategy】

一、简介 我们知道Java中有许多的设计模式&#xff0c;总共32个左右。常见的比如简单工厂、建造者、原型、代理、桥接等&#xff0c;这些设计模式相当于是一个规范&#xff0c;主要是总结出来便于大家理解开发的一种算法思路。 今天主要是给大家介绍一下我们常见的策略模式&a…

自动化框架错误排查:本地全通过,pipline上大部分报错

现象: 最近经过一次切环境和验证码部分的代码重构,果不其然,我们的自动化框架就出错了 我在本地修改调试,并在堡垒机上全部跑过 但在pipline上则大部分报错 进一步排查 这么多case报错,而且报错log都一模一样,推断是底层出错 我在堡垒机上使用命令行来跑case,发现与…

【深度学习】Stable Diffusion中的Hires. fix是什么?Hires. fix原理

文章目录 **Hires. fix****Extra noise**Upscalers Hires. fix https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#hires-fix 提供了一个方便的选项&#xff0c;可以部分地以较低分辨率呈现图像&#xff0c;然后将其放大&#xff0c;最后在高分辨率下添…

day69

今日回顾 Django与Ajax 一、什么是Ajax AJAX&#xff08;Asynchronous Javascript And XML&#xff09;翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互&#xff0c;传输的数据为XML&#xff08;当然&#xff0c;传输的数据不只是XML,现在…

羊大师教你如何有效应对冬季流感,保护自己与家人

羊大师教你如何有效应对冬季流感&#xff0c;保护自己与家人 随着冬季的临近&#xff0c;流感病毒将再次蔓延。如何预防冬季流感来袭&#xff0c;成为了许多人关注的话题。幸运的是&#xff0c;我们可以采取一系列的预防措施来保护自己和家人&#xff0c;避免被流感侵袭。下面…

技术or管理?浅谈软件测试人员的未来职业发展,值得借鉴

我们在工作了一段时间之后&#xff0c;势必会感觉到自己已经积累了一些工作经验了&#xff0c;会开始考虑下一阶段的职业生涯会如何发展。测试人员在职业生涯中的不确定因素还是不少的&#xff0c;由于其入门门槛不高&#xff0c;不用学习太多技术性知识即可入行&#xff0c;所…

聚焦数据库Serverless创新,就在2023亚马逊云科技re:Invent

11月28日&#xff0c;亚马逊云科技在其最新的re:Invent 2023大会上宣布了三项重要的serverless创新&#xff0c;这些创新将极大地简化客户在任何规模上分析和管理数据的能力。以下是这些发布的主要要点总结和分析。 Amazon Aurora Limitless Database的新功能&#xff1a; 功能…

MS85163实时时钟/日历可Pin to Pin兼容PCF8563

MS85163/MS85163M是一款CMOS实时时钟(RTC) 和日历电路&#xff0c;针对低功耗进行了优化&#xff0c;内置了可编程的时钟输出、中断输出和低电压检测器。可Pin to Pin兼容PCF8563。所有寄存器地址和数据都通过两线双向I 2C总线进行串行传输&#xff0c;最大总线传输速度为 400k…

软件测试:测试用例八大要素模板

一、通用测试用例八要素 1、用例编号&#xff1b; 2、测试项目&#xff1b; 3、测试标题&#xff1b; 4、重要级别&#xff1b; 5、预置条件&#xff1b; 6、测试输入&#xff1b; 7、操作步骤&#xff1b; 8、预期输出 二、具体分析通用测试用例八要素 1、用例编号 一般是数字…

让业务带着问题去分析,用大数据分析工具

随着企业数字化转型进程的加快&#xff0c;企业大数据分析的需求也水涨船高&#xff0c;不少企业都在尝试上线BI大数据分析工具&#xff0c;让各业务人员带着业务问题去分析数据&#xff0c;获取解决问题的数据信息。而各高校也在搭建大数据分析教学平台&#xff0c;与时俱进提…

微信小程序${wx.env.USER_DATA_PATH}在哪

var FileSystemManager wx.getFileSystemManager()FileSystemManager.writeFile({filePath: ${wx.env.USER_DATA_PATH}/hello.txt,data: data.Body,encoding: utf8,success(res) {console.log(res)},fail(res) {console.error(res)}})

人工智能的新篇章:深入了解大型语言模型(LLM)的应用与前景

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

【多线程】-- 11 死锁、Lock锁

多线程 7 死锁 多个线程各自占有一些共享资源&#xff0c;并且互相等待其他线程占有的资源才能运行&#xff0c;而导致两个或多个线程都在等待对方释放资源&#xff0c;都停止执行的情形。某一个同步块同时拥有”两个以上对象的锁“时&#xff0c;就可能会发生死锁的问题。 …

nn.AdaptiveAvgPool2d(output_size)输入和输出怎么回事?

前言 nn.AdaptiveAvgPool2d(output_size) 函数作用&#xff1a;自适应进行平均池化。不用管输入、stride、padding&#xff0c;函数参数只有输出大小&#xff0c;其他的这个函数帮你搞定。 问题就是&#xff0c;我想知道他是咋搞定的&#xff1f; 1 函数的使用 先把例子摆上…

Socket和Http的通讯原理,遇到攻击会受到哪些影响以及如何解决攻击问题。

德迅云安全-领先云安全服务与解决方案提供商 Socket和HTTP通信原理&#xff1a; Socket通信原理&#xff1a; Socket是一种应用程序编程接口&#xff08;API&#xff09;&#xff0c;用于在单个进程或多个进程之间进行通信。它提供了一种灵活的、异步的通信方式&#xff0c;使…

【蓝桥杯】翻硬币

翻硬币 思路&#xff1a; 其实有点贪心的意思&#xff0c;依次比较&#xff0c;不同就1&#xff0c;然后修改自己的字符串和下一个的字符串&#xff0c;再匹配。 #include<iostream> #include<string> using namespace std;string now,res;int main(void) {cin&g…