装箱和拆箱

C# 如何避免装箱和拆箱操作 Net的类型分为两种,一种是值类型,另一种是引用类型。这两个类型的本质区别,值类型数据是分配在栈中,而引用类型数据分配在堆上。那么如果要把一个值类型数据放到堆上,就需要装箱操作;反之,把一个放在堆上的值类型数据取出来,则需要进行拆箱操作。 对于如下简单的装箱和拆箱操作语句。 int i = 123;   object obj = i;//Boxing   if( obj is int )   int j = (int) obj;//Unboxing 效率更高的做法如下: SomeT. 阅读详情

1.int、Integer、String三者的相互转换(不涉及Autoboxing/Auto-Unboxing)

  1. public static void main(String[] args) {
  2.     int num;
  3.     Integer integer;
  4.     String numString;
  5.     
  6.     //(1) int转换为Integer:public static Integer valueOf(int i)
  7.     num = 100;
  8.     integer = Integer.valueOf(num);
  9.     integer = new Integer(num);
  10.     integer = (Integer) num;
  11.     //(2) Integer转换为int:public int intValue()
  12.     integer = new Integer(100);
  13.     num = integer.intValue();
  14.     //(3) Integer转换为String
  15.     integer = new Integer(100);
  16.     numString = integer.toString();
  17.     //(4) String转换为Integer:public static Integer valueOf(String s) throws NumberFormatException
  18.     numString = "100";
  19.     integer = Integer.valueOf(numString);
  20.     //基本数据类型和类是无法相互转换的,除非通过int的包装类进行过渡。
  21.     //(5) int转换为String
  22.     num = 100;
  23.     numString = Integer.toString(num);
  24.     numString = Integer.valueOf(num).toString();
  25.     numString = new Integer(num).toString();
  26.     //(6) String转换为int:public static int parseInt(String s) throws NumberFormatException
  27.     numString = "100";
  28.     num = Integer.parseInt(numString);
  29.     num = Integer.valueOf(numString).intValue();
  30. }

2.int和Integer的关系

Integer是int的封装类(也称为引用类型or封装类型,Warpper),在堆中创建,占用内存和资源较多,但是提供丰富的访问方法;同时作为真正的对象,可以直接放入集合。初始值为null。

int是基本数据类型(原始类型or内置类型,Primitive),在栈中创建,占用内存和资源较少,但是不能作为对象调用其toString()、hashCode()、getClass()、equals()等方法;也不能被直接加入到集合中,初始值为0

传统上,在Java程序中,可以往一个容器类里直接放入一个对象;但是如果打算放入的是一个数字、字符或布尔值的话,就要先加入一个"生成包裹它们的对象"的步骤。 造成这种现象的原因是,在Java语言当中一直存在着两套非常不同的类型系统:

一套是所谓的"引用类型"(Reference Types),包括所有的类和接口。这些类型的数据被看作对象,所以可以用一个Object型的变量来保存。

一套是所谓的"基本类型"(Primitive Types),包括:byte、short、int、long、float、double、char和boolean。这些类型的数据不是对象,因此也不能用Object型的变量来保存。

同时采用这样两套类型系统,可以得到一些性能方面的好处:基本类型的数据不是对象,所以创建得更快、占用的空间更少、收回它们占用的资源也更容易;引用类型则带来了所有对象具有的优点。

3.Boxing和Unboxing

所谓装箱(Boxing),就是把值类型用它们相对应的引用类型包起来,使它们可以具有对象的特质,如我们可以把int型包装成Integer类的对象,或者把double包装成Double。

所谓拆箱(Unboxing),就是跟装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为值类型的数据。

在J2SE 5.0发布之前,我们只能手工的处理装箱和拆箱,而现在,编译器可以帮我们自动地完成这些必要的步骤。下面的代码我提供两个版本的装箱和拆箱,一个版本使用手工的方式,另一个版本则交给编译器去完成:

  1. //这两个方法是等价的。其实在jdk5.0后,我们执行autoBoxingUnboxing()方法,编译器会将其自动将转换为形如manualBoxingUnboxing()方法的代码去执行
  2. public static void manualBoxingUnboxing(int i) {
  3.     List<Integer> list = new ArrayList<Integer>();
  4.     list.add(0, new Integer(i));
  5.     int a = list.get(0).intValue();
  6.     System.out.println("The value of i is " + a);
  7. }
  8. public static void autoBoxingUnboxing(int i) {
  9.     List<Integer> list = new ArrayList<Integer>();
  10.     list.add(0, i);
  11.     int a = list.get(0);
  12.     System.out.println("The value of i is " + a);
  13. }

自动装箱(Autoboxing),它可以直接把基本类型赋值给封装类型。eg:Integer num = 10; Double d = 2d;

自动拆箱(Auto-Unboxing),它可以把封装类型赋值给基本类型。eg:int num = new Integer(10); double d = new Double(2d);

所谓Autoboxing/Auto-Unboxing,就是把原来需要手工Boxing/Unboxing的工作交给编译器去完成。

4.容易发生错误的地方

(1)基本类型的数组和引用类型数组之间不会自动转化:int[] ints = {1, 2, 3}; Integer[] integers = ints; /* 编译时出错 */

(2)null的转化问题:试图对null进行Auto-Unboxing操作会导致一个"NullPointerException":Integer i = null; int j = i; /* 运行时错误 */

大部分违反了使用"Autoboxing/Auto-Unboxing"机制时,需要遵守的约束的代码,都会造成编译错误。因此,即使并未准确的记住有关的规则,也不难及时发现。只有违背了"不能对null进行Auto-Unboxing操作"的限制时,引发的是运行时异常,需要特别小心。

(3)对于不同类型间的强制类型转换也很可能出现错误,这个在平时的代码编写中要注意积累总结。

5.在自动装箱时对于值从-128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用。如果超过了从-128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个Integer对象。

  1. public static void main(String[] args) {
  2.     int j = 1;
  3.     Integer integer = Integer.valueOf(j);
  4.     
  5.     if ((Integer) j == integer) System.out.println("-128~127之间的Integer对应的堆地址相同");
  6.     else System.out.println("-128~127之间的Integer对应的堆地址不相同");
  7.     
  8.     j = 256;
  9.     integer = Integer.valueOf(j);
  10.     if ((Integer) j == integer) System.out.println("-128~127之外的Integer对应的堆地址相同");
  11.     else System.out.println("-128~127之外的Integer对应的堆地址不相同");
  12. }
  13. /*
  14.  * 输出结果:
  15.  * -128~127之间的Integer对应的堆地址相同
  16.  * -128~127之外的Integer对应的堆地址不相同
  17.  * 
  18.  * */

6.对性能的妨碍

由于Autoboxing机制的实质是"自动创建能代表基本类型数据的对象",所以,不可避免的会对性能造成一些妨碍。如果只是利用Autoboxing/Auto-Unboxing机制来保存基本类型的数据(例如把基本类型的数据放到Collection里面之类),这种影响倒还可以忽略,因为这只是把原来需要手工进行的工作自动化了;但是,如果要频繁的借助Autoboxing来给一个引用类型变量赋值,这开销很容易上升到需要加以注意的程度。例如:注意对引用类型的变量使用"++"和"--"运算符的时候,也会创建新的对象,而不是在修改原来对象的状态。例如:

  1. Integer i = new Integer(1); 
  2. Integer j = i; /* 让j、i指向同一对象 */
  3. System.out.println(j == i); /* 目前j、i是同一对象,因此输出"true" */
  4. i++;
  5. System.out.println(j == i); /* 现在j、i是不同对象,因此输出"false" */

这个现象是由于Java里的引用类型是"不可变的(immutable)",即我们不能修改引用类型对应堆地址的值,如果要修改,只是重新创建一个堆地址,然后将引用引到新的堆地址上。在需要大量赋值操作的时候,可以通过适当使用一些基本类型的局部变量来减轻对性能方面的影响。不过,如果性能的瓶颈在于要往一个容器里频繁放入基本类型的数据的话,恐怕就得靠改用一些专门为容纳基本类型的数据而设计的容器类来解决了(例如Jarkata Commons Primitives组件里提供的那些)。

所以不要过分依赖自动装箱与拆箱,您还是必须知道基本数据类型与对象的差异。

正交试验-方差分析-数据展现形式 方差分析(ANOVA, Analysis of Variance)用于比较多个组之间的均值差异,确定因素对响应变量的显著性影响。示例分析。 阅读详情

相关推荐

紫光同创国产FPGA学习之Fabric Debugger

文章从紫光同创参考书拷贝过来的。因为我用的时候,看了一下就会用了(纯粹只是会用了,默认和xilinx的一样),没有看教程。先更新点文本,后面在写程序。 一、      软件简介 Fabric Debugger是一款界面化的FPGA芯片调试工具,能够针对公司目前以及未来的FPGA芯片进行在线调试。本软件直接与JtagHub、DebugCore交互,能够实时的配置目标FPGA、设置触发条件并且观测结...

my_share的专栏 6391

Java自动装箱与拆箱及其陷阱

在本文中,笔者向大家介绍下Java中一个非常重要也非常有趣的特性,就是自动装箱与拆箱,并从源码中解读自动装箱与拆箱的原理,同时这种特性也留有一个陷阱。开发者如果不注意,就会很容易跌入这个陷阱。 自动装箱(Autoboxing) 定义           大家在平时编写Java程序时,都常常以以下方式来定义一个Integer对象: Integer i=100;

JairusChan的技术博客 1万+

机器学习第四个算法ANN(人工神经网络)

我是在14年9月刚读研的时候听到一个说法叫“类人脑算法”很火热,之后搞了很长一段时间相关的蓄水池算法等,但大都没有摸到门路而中途放弃了。现今看来,还是缺少一些知识背景,也不善于在网络上学习,随时间推移,也逐渐明白这是机器学习的一小部分,并且逐渐发展的名称叫做人工神经网络的算法,如果网络层较多,又会有个别名,叫做深度学习。其中个用到的最著名的算法是背向传输算法(backpropagation),而这个

legalhighhigh的博客 1万+

C#中定义装箱和拆箱详解

1. C#装箱和拆箱是一个抽象的概念。 2. C#装箱是将值类型转换为引用类型;拆箱是将引用类型转换为值类型。 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来。 例如: int val = 100; object obj = val; Console.WriteLine (“对象的值 = {0}", obj); 这是一个装...

qq_34573534的博客 7086

别再只插线了!用示波器‘偷看’USB-C PD协议握手全过程(附BMC/4B5B编码解析)

本文详细介绍了如何使用示波器捕获并解码USB-C PD协议的握手过程,包括BMC/4B5B编码的解析技巧。从硬件配置到波形分析,再到协议注入,为工程师提供了一套完整的实战解码手册,帮助深入理解PD协议的工作原理。

weixin_42526417的博客 402

java 对接工行聚富通H5聚合支付接口

java 对接工行聚富通H5聚合支付接口

lgl的博客 858

Java中的装箱和拆箱

在Java中,装箱(boxing)和拆箱(unboxing)是自动进行的基本数据类型和包装数据类型之间的转换机制。

weixin_69477306的博客 2656

Vue - 在纯 HTML 普通项目中实现组件化,让原生 html 项目支持引入 *.vue 组件 / 组件与组件间的互相引用等,完美解决了引入组件出现的跨域问题(保姆级详细教程,完整示例源码及插件)

html中使用vue组件,在HTML页面中引入vue组件,HTML界面利用http-vue-loader.js以组件方式引入vue文件,使用http-vue-loader引入组件出现报错,在html页面使用http-vue-loader插件引入组件报跨域错误,如何解决http-vue-loader引用组件时出现跨域问题,纯html原生web项目引入vue后如何实现组件引入,使用http-vue-loader插件控制台报错跨域,http-vue-loader跨域怎么办官方文档,html页面如何引入.vu

🏆 前端领域优质创作者 3907

什么是装箱?什么是拆箱?装箱和拆箱的执行过程?

什么是装箱?什么是拆箱?装箱和拆箱的执行过程?常见问题? 1、什么是装箱?什么是拆箱? 装箱:基本类型转变为包装器类型的过程。 拆箱:包装器类型转变为基本类型的过程。 //JDK1.5之前是不支持自动装箱和自动拆箱的,定义Integer对象,必须 Integer i = new Integer(8); //JDK1.5开始,提供了自动装箱的功能,定义Integer对象可以这样 Int...

ConstXiong 2万+

【WorkBuddy从入门到精通实战教程】使用手册 第 1 章 初识 WorkBuddy

腾讯推出全场景AI办公助手WorkBuddy,突破传统聊天机器人局限,实现从需求理解到结果交付的全流程自动化。该工具通过自然语言交互,可自主规划执行复杂任务,包括文件处理、数据分析、PPT制作等,支持多模型切换和技能扩展。内置权限管控机制确保本地文件操作安全,显著降低人工切换工具的成本,提升职场效率。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 1291

ubuntu20 安装px4、mavros、QGroundControl

首先安装一下ant,否则没法运行,同时因20.04的缺少动态库libawt_xawt.so无法被Java8给调用,我的解决办法是去18.04把18.04的相同路径下的动态库libawt_xawt.so移动到20.04的/usr/lib/jvm/java-11-openjdk-amd64/lib/路径中。用rosdepc的时候,你得确保你用的是鱼香ROS的提供的ROS安装方法,否则是没有rosdepc的。make px4_sitl gazebo之前,可以安装一下gazebo的 模型。二、安装MAVROS。

qq_58060770的博客 3349

Java中的拆箱和装箱机制

一.装箱拆箱的定义 众所周知,Java中有8大基本数据类型,其为每种基本数据类型都提供了对应的包装器类型。 下表是基本数据类型对应的包装器类型: 在Java SE5之前,如果要生成一个数值为5的Integer对象,必须这样进行: Integer i = new Integer(5); 而从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为5的Integer对象,只需要这样就可以了...

小白不菜的博客 3991

matlab 显示曲面网格【2025最新版】

matlab点云工具箱对点云三维重建结果显示的函数。博客长期更新,本文最近更新时间为:2025年9月14日。

点云侠的博客 2580

C# 装箱和拆箱

C#中值类型和引用类型都可以和object类型进行转换; 装箱转换是指将一个值类型显式或隐式地转换成一个object类型;把一个值类型的值装箱,就是创建一个object类型然后将这个值复制给这个object,装箱后的object对象数据放在堆中;所谓的拆箱,就是复制堆中的对象到堆栈中,并且返回它的值; 对于简单的赋值而言,装箱和拆箱过程需要进行大量的计算; 装箱和拆箱的性能问题主要通过泛型来解决; ...

mozhi 2648

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

装箱和拆箱,自动装箱和自动拆箱

装箱和拆箱,自动装箱和自动拆箱 以Integer的创建为例。 装箱和拆箱 装箱:把基本数据类型转换成包装类对象(int—>Integer) Integer num1=new Integer(17); 拆箱:把一个包装类的对象,转换成基本类型的变量(Integer—>int) int num2=num1.intValue(); 自动装箱和自动拆箱 自动装箱: Integer num3...

a133445的博客 799

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C#的装箱和拆箱

一、装箱和拆箱概念 装箱:将值类型转换为引用类型称为装箱 拆箱:将引用类型转换为值类型称为拆箱 1、在C#中,值类型的数据被保存在栈(stack)上,而引用类型的数据被保存在堆(heap)上,在栈上只是保存了这些数据在堆内存中的首地址 using Ststem.Collections; using System.Collections.Generic; using UnityEngine; class Animal { public int age; public Animal(int age)

极客园地 7680

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

装箱和拆箱分别什么意思?

1、装箱和拆箱的定义; 2、为何需要装箱?(为何要将值类型转为引用类型?) 3、装箱/拆箱的内部操作 4、装箱/拆箱对执行效率的影响

微微的猪食小窝 3295

Java自动拆箱和装箱

什么是自动拆箱和装箱定义 自动装箱就是 Java 自动将原始数据类型转为对应的包装类对象 比如将 int 型的变量转成 Integer对象 自动拆箱反之(从 Java 1.5 开始引入) 过程 自动装箱时,编译器调用 valueOf() 将原始数据类型值转为对象;同时自动拆箱时,编译器调用类似 intValue(), doubleValue() 这类方法将对象转换成原始类型值 基本类型 大小

戎码人生 1万+

【TS学习】(5)装箱和拆箱

装箱和拆箱

qq_45739157的博客 1067

理解装箱和拆箱

前言 最近在回顾复习Java基础中的一些知识点,发现了一些以前见过但是没有留意却特别有意思的知识特性,比如这次想分享的Java中一个常见的特性:自动装箱与拆箱。这个知识点和特性其实在我们开发过程中经常会遇到。同时我们也会去使用一些基本数据类型或者是封装数据类型,但是对于他们之间的一些转换等特性可能不是特别清楚。也可能出现在我们的面试中。本章部分内容从源码中解读一些自动装箱与拆箱的原理,以及会出现的一些陷阱已经性能等。如有错误还请大家及时指出~ 本文已同步至 GitHub/Gitee/公众号,感兴趣的同学帮忙

星河队长 898

java中的装箱和拆箱详解

java中的装箱和拆箱详解

泡^泡 3582

什么是装箱和拆箱?

<br /> <br />        装箱和拆箱:任何值类型、引用类型可以和object(对象)类型之间进行转换。装箱转换是指将一个值类型隐式或显式地转换成一个object类型,或者 把这个值类型转换成一个被该值类型应用的接口类型(interface-type)。把一个值类型的值装箱,就是创建一个object实例并将这个值复制 给这个object,装箱后的object对象中的数据位于堆中,堆中的地址在栈中。被装箱的类型的值是作为一个拷贝赋给对象的。如:int i = 10;object obj =

Dr. SUN 的专栏 840

C#装箱和拆箱

文章目录C#装箱和拆箱题记:何为装箱和拆箱? C#装箱和拆箱 题记: 最近一个研究项目,需要分解C#写的一个工程软件。只好从头回顾下C#语言的特色。其中一项内容就是对C#装箱和拆箱的认识和理解。拙笔写一篇博客来记录一番。 何为装箱和拆箱? 想必大家都见识过和“装集装箱柜”吧,把一大堆的货物先纸箱或者托盘打包,然后整齐地放进集装箱柜。C#这里的装箱指的是把不同类型的数据打包成在一起。 来看标准的手册定义: 装箱是将值类型转换为“ object 类型或由此值类型实现的任何接口类型”的过程。 比较拗口是吧,简而言

qq_21291397的博客 500

C#中装箱和拆箱

.NET 平台支持的两大数据类型:值类型和引用类型。值类型比引用类型更高效,因为它没有指针引用,不用分配在托管堆中,也不用被 GC 回收。但有时候你可能偶尔需要将一种类型的变量表示为另一种类型的变量。为此,C# 提供了装箱和拆箱的机制。 1理解装箱 简单地说,装箱就是将一个值类型的数据存储在一个引用类型的变量中。 假设你一个方法中创建了一个int类型的本地变量,你要将这个值类型表示为一个引用类型,那么就表示你对这个值进行了装箱操作,如下所示: staticvoidSimpleBox() {...

秉持Love and share的态度去学习和生活 2443
上一篇: Date相关
下一篇: 反射
ForWayfarer
博客等级 码龄20年 60粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值