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. 报错:3 字节的 UTF-8 序列的字节 3 无效。

    错误如下: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with n ...

  2. Python 错误类型及解决方法

    SyntaxError: invalid syntax          表示“语法错误:不正确的语法” 检查代码的缩进,代码格式是否正确,Python的缩进一般为四个空格,tab键尽量不要用. In ...

  3. js面向对象实现切换面板

    js面向对象的特点: 继承(inheritance):对象方法和属性的继承 多态(polymorphism):组件开发 抽象(abstract):抓住核心问题 封装(encapsulation):把功 ...

  4. 51 Nod 1678 lyk与gcd

    1678 lyk与gcd 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 这天,lyk又和gcd杠上了.它拥有一个n个数的数列,它想实现两种操作. 1:将  ai  ...

  5. ASP.NET MVC 1.0 哈哈。。转过来,还没学。。

    原文发布时间为:2009-06-13 -- 来源于本人的百度文章 [由搬家工具导入] ASP.NET MVC 1.0 发布了投递人 itnews 发布于 2009-03-19 00:46 评论(8) ...

  6. [LeetCode] Maximum Depth of Binary Tree dfs,深度搜索

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  7. 语法错误: 标识符“__RPC__out_xcount_part” 解决方法

    1.错误描述 2.解决方案:将 $(DXSDK_DIR)\Include; 放到最后面,如下

  8. 使用python将ppm格式转换成jpg【转】

    转自:http://blog.csdn.net/hitbeauty/article/details/48465017 最近有个很火的文章,叫 有没有一段代码,让你觉得人类的智慧也可以璀璨无比? 自己试 ...

  9. ORACLE的字符串操作函数

    字符函数——返回字符值 这些函数全都接收的是字符族类型的参数(CHR 除外)并且返回字符值.除了特别说明的之外,这些函数大部分返回VARCHAR2类型的数值.字符函数的返回类型所受的限制和基本数据库类 ...

  10. Fiddler简介以及web抓包

    Fiddler简介以及web抓包 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.Fiddler简介简单来说,Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联 ...