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. 小w的喜糖(candy)

    小w的喜糖(candy) 题目描述 废话不多说,反正小w要发喜糖啦!! 小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类.这时,小w突发奇想,如果这n个人相互交换手中的糖,那会有多少种方案使得每 ...

  2. 洛谷P2866 [USACO06NOV]糟糕的一天Bad Hair Day

    P2866 [USACO06NOV]糟糕的一天Bad Hair Day 75通过 153提交 题目提供者洛谷OnlineJudge 标签USACO2006云端 难度普及/提高- 时空限制1s / 12 ...

  3. 【ubuntu】配置zsh

    1. 修改默认shell为zsh chsh -s /bin/zsh echo $SHELL$ 2. 下载oh-my-zsh wget https://raw.github.com/robbyrusse ...

  4. Python之数据结构:集合

    一.set集合 1.集合是一个无序不重复元素集,有去重的作用 set集合类需要的参数必须是迭代器类型的,如:序列.字典等,然后转换成无序不重复的元素集.由于集合是不重复的,所以可以对字符串.列表.元组 ...

  5. 外星千足虫(bzoj 1923)

    Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个“01”串和一个数字,用一个空格隔开.“01 ...

  6. 学习 表单验证插件validate

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. linux内核情景分析之命名管道

    管道是一种"无名","无形文件,只可以近亲进程使用,不可以再任意两个进程通信使用,所以只能实现"有名","有形"的文件来实现就可以 ...

  8. steam linux 使用socks代理

    环境:Ubuntu 15.10 64bit,Steam:built:May 10 2016 需要的工具:ssh/shadowsocks等socks5代理,tsocks ---------------- ...

  9. C#图片转成流,流转成图片,字节转图片,图片转字节的方法

    图片转成流 Bitmap b = new Bitmap(Server.MapPath(ppath)); Stream ms = new MemoryStream(); b.Save(ms, Syste ...

  10. TreeMap和TreeSet的区别与联系

    TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常 ...