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);

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

[Java开发之路](23)装箱与拆箱的更多相关文章

  1. Java自学-数字与字符串 装箱和拆箱

    Java中基本类型的装箱和拆箱 步骤 1 : 封装类 所有的基本类型,都有对应的类类型 比如int对应的类是Integer 这种类就叫做封装类 package digit; public class ...

  2. java和c#中的装箱和拆箱操作

    c#装箱和拆箱 装箱:整体上来说,装箱是将值类型转换成引用类型,比如将Vector3转换成Object类型. 具体而言: 1)在托管堆中为值类型分配内存.除了原始的数值以外还应该有指向该数值的引用. ...

  3. Java包装类,基本的装箱与拆箱

    我的博客 何为包装类 将原始类型和包装类分开以保持简单.当需要一个适合像面向对象编程的类型时就需要包装类.当希望数据类型变得简单时就使用原始类型. 原始类型不能为null,但包装类可以为null.包装 ...

  4. Java学习笔记之——自动装箱与拆箱

    自动装箱与拆箱 基本类型与引用类型的互相转换 1. 基本类型对应的包装类 byte    short       char      int       long    flaot    double ...

  5. JAVA基础之——三大特征、接口和抽象类区别、重载和重写区别、==和equals区别、JAVA自动装箱和拆箱

    1 java三大特征 1)封装:即class,把一类实体定义成类,该类有变量和方法. 2)继承:从已有的父类中派生出子类,子类实现父类的抽象方法. 3)多态:通过父类对象可以引用不同的子类,从而实现不 ...

  6. c#重点[数据类型,构造方法,变量,变量,运算符,装箱,拆箱]

    1.命名规范    类  :名词 每个单词的首字母大写 Dog Student  PersonClass 字段:首个字母小写,如果有多个单词,后面的单词首字母大写 string name=" ...

  7. Java 自动装箱与拆箱

    Java 自动装箱与拆箱(Autoboxing and unboxing)   什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供 ...

  8. 全面理解java自动装箱和拆箱(转)

    自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象.自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接. 如 ...

  9. Java装箱和拆箱的基本概念及使用

    Java装箱和拆箱的基本概念及使用 要理解装箱和拆箱的概念,就要理解Java数据类型 装箱:把基本类型用它们相应的引用类型包装起来,使其具有对象的性质.int包装成Integer.float包装成Fl ...

随机推荐

  1. Flask deployment on gunicorn with flask script

    https://stackoverflow.com/questions/34265870/flask-deployment-on-gunicorn-with-flask-script 依赖 Flask ...

  2. Java EE 学习(3):IDEA + maven 搭建 web(1)

    摘要: 主要讲解使用 IDEA 开发 Spring MVC 的环境搭建,Maven的简单教学. 参考1:https://my.oschina.net/gaussik/blog/385697 参考2:h ...

  3. updatepanel中使用alert弹出框方法

    原文发布时间为:2009-05-17 -- 来源于本人的百度文章 [由搬家工具导入]         ScriptManager.RegisterStartupScript(this.UpdatePa ...

  4. locust参数关联及批量注册

    前言 前面[Locust性能测试2-先登录场景案例]讲了登录的案例,这种是直接传账号和密码就能登录了,有些登录的网站会复杂一点,需要先从页面上动态获取参数,作为登录接口的请求参数,如[学信网:http ...

  5. SpringBoot 分包方式多数据源

    1.引入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spri ...

  6. Spring Cloud Feign 声明式服务调用

    目录 一.Feign是什么? 二.Feign的快速搭建 三.Feign的几种姿态 参数绑定 继承特性 四.其他配置 Ribbon 配置 Hystrix 配置 一.Feign是什么? ​ 通过对前面Sp ...

  7. Java 字符集,编码、解码

    1. 计算机中文件.数据底层都是基于二进制的. 计算机底层并没有文本文件.图片文件之分,它只是记录着每个文件的二进制序列. 字符集:包含着字符和二进制序列之间的对应关系,一个字符对应一个二进制序列. ...

  8. tcp/ip RFC

     http://www.ietf.org/rfc.htmlhttp://www.rfc-editor.org

  9. 求用delphi编写的LRC校验位算法函数,急!!!

    求用delphi编写的LRC校验位算法函数,急!!! 某命令串为":010200000001FC" 其16进制为“3A 30 31 30 32 30 30 30 30 30 30 ...

  10. Git 详细的操作指南笔记

    喜欢的朋友start一下,长期更新文章 设置 安装git后我们需要配置一下,告诉git我们的基本信息等等..一般在用户范围内去配置 git ,也就是在 global 范围. global 全局设置 $ ...