[Java开发之路](23)装箱与拆箱

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50991203 1. 简介大家对基本数据类型都非常熟悉,例如 int、float、double、boolean、char 等。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50991203

1. 简介

大家对基本数据类型都非常熟悉,例如 int、float、double、boolean、char 等。基本数据类型是不具备对象的特性,比如基本类型不能调用方法、功能简单。。。,为了让基本数据类型也具备对象的特性, Java 为每个基本数据类型都提供了一个包装类,这样我们就可以像操作对象那样来操作基本数据类型。 

对象包装类是不变的,即一旦构造了包装类,就不允许更改包装在其中的值。同时,对象包装类还是final,因此不能定义它们的子类。

假设想定义一个整型数组列表,而尖括号中的类型参数不允许是基本类型的,也就是说,不允许写成ArrayList<int>。这里用到了对象包装类。我们可以声明一个Integer对象的数组列表。

 
  
  1. ArrayList<Integer> list = new ArrayList<Integer>();

备注:

ArrayList<Integer>的效率远远低于int[] 数组,但是还是使用ArrayList,其原因就是程序员操作的方便性执行效率更加重要。

进行如下操作:

 
  
  1. list.add(3);

将自动转换为:

 
  
  1. list.add(Integer.valueOf(3));

这种变换就是自动装箱

相反的,当将一个Integer对象赋予一个int值时,将会自动拆箱:

 
  
  1. int n = list.get(i)

将自动转换为:

 
  
  1. int n = list.get(i).intValue();


备注:

装箱与拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的方法调用。虚拟机只是执行这些字节码。

使用数值对象包装类有一个好处:

可以将某些基本方法放置在包装类中。

 
  
  1. int x = Integer.parseInt(s);
这里与Integer对象一点关系也没有,parseInt只是一个静态方法,但是Integer类是放置这个方法的一个好去处。


2. 分类

装箱:把基本类型转换成包装类,使其具有对象的性质,又可分为手动装箱和自动装箱

 
  
  1. package com.qunar.test;
  2. public class HelloWorld {
  3. public static void main(String[] args) {
  4. // 定义一个int基本类型值
  5. int num = 14;
  6. // 手动装箱
  7. Integer x = new Integer(num);
  8. // 自动装箱
  9. Integer y = num;
  10. System.out.println("x->"+x+" y->"+y);
  11. }
  12. }

拆箱:和装箱相反,把包装类对象转换成基本类型的值,又可分为手动拆箱和自动拆箱

 
  
  1. package com.qunar.test;
  2. public class HelloWorld {
  3. public static void main(String[] args) {
  4. // 定义一个Integer包装类
  5. Integer integer = new Integer(8);
  6. // 手动拆箱
  7. int x = integer.intValue();
  8. // 自动拆箱
  9. int y = integer;
  10. System.out.println("x->"+x+" y->"+y);
  11. }
  12. }

3. 分析

自动装箱的弊端:

自动装箱有一个问题,那就是在一个循环中进行自动装箱操作的情况,如下面的例子就会创建多余的对象,影响程序的性能:

 
  
  1. Integer sum = 0;
  2. for(int i=1000; i<5000; i++){
  3.   sum+=i;
  4. }

上面的代码sum+=i可以看成sum = sum + i,但是+这个操作符不适用于Integer对象,首先sum进行自动拆箱操作,进行数值相加操作,最后发生自动装箱操作转换成Integer对象。其内部变化如下:

 
  
  1. sum = sum.intValue() + i;
  2. Integer sum = new Integer(result);

因此在我们编程时,需要注意到这一点,正确地声明变量类型,避免因为自动装箱引起的性能问题。



目录
相关文章
|
12天前
|
人工智能 安全 IDE
一天成为Java开发高手:用飞算JavaAI实现十倍提效
“一天成为Java开发高手”曾被视为天方夜谭,但飞算JavaAI的出现改变了这一局面。这款AI开发助手通过智能引导、需求分析、自动化逻辑处理和完整代码工程生成,大幅简化了Java开发流程。它不仅帮助新手快速上手,还让资深开发者提高效率,减少调试时间。现在,参与“飞算JavaAI炫技赛”,展示你的开发实力,赢取丰厚奖品!
|
24天前
|
JavaScript 安全 Java
智慧产科一体化管理平台源码,基于Java,Vue,ElementUI技术开发,二开快捷
智慧产科一体化管理平台覆盖从备孕到产后42天的全流程管理,构建科室协同、医患沟通及智能设备互联平台。通过移动端扫码建卡、自助报道、智能采集数据等手段优化就诊流程,提升孕妇就诊体验,并实现高危孕产妇五色管理和孕妇学校三位一体化管理,全面提升妇幼健康宣教质量。
46 12
|
3天前
|
搜索推荐 Java Android开发
课时146:使用JDT开发Java程序
在 Eclipse 之中提供有 JDT环境可以实现java 程序的开发,下面就通过一些功能进行演示。 项目开发流程
|
5天前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
|
13天前
|
人工智能 Java 数据处理
Java高级应用开发:基于AI的微服务架构优化与性能调优
在现代企业级应用开发中,微服务架构虽带来灵活性和可扩展性,但也增加了系统复杂性和性能瓶颈。本文探讨如何利用AI技术,特别是像DeepSeek这样的智能工具,优化Java微服务架构。AI通过智能分析系统运行数据,自动识别并解决性能瓶颈,优化服务拆分、通信方式及资源管理,实现高效性能调优,助力开发者设计更合理的微服务架构,迎接未来智能化开发的新时代。
|
2月前
|
前端开发 Java 程序员
菜鸟之路day02-04拼图小游戏开发一一JAVA基础综合项目
本项目基于黑马程序员教程,涵盖面向对象进阶、继承、多态等知识,历时约24小时完成。项目去除了登录和注册模块,专注于单机游戏体验。使用Git进行版本管理,代码托管于Gitee。项目包含窗体搭建、事件监听、图片加载与打乱、交互逻辑实现、菜单功能及美化界面等内容。通过此项目,巩固了Java基础并提升了实际开发能力。 仓库地址:[https://gitee.com/zhang-tenglan/puzzlegame.git](https://gitee.com/zhang-tenglan/puzzlegame.git)
46 6
|
2月前
|
Java 应用服务中间件 API
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
50 5
|
2月前
|
SQL Java API
|
2月前
|
前端开发 Java 数据库连接
【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
深度解读JavaWeb开发在Java学习中的重要性
41 4
|
2月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
90 2

热门文章

最新文章