java学习之理解自动拆装箱特性

目录
  • 一、自动装拆箱是什么?
  • 二、拆装箱的使用
    • 1.引入包装类的原因:
    • 2.自动拆装箱的运用
    • 3.一些典型举例

一、自动装拆箱是什么?

  • 有时,需要将int这样的基本类型转换为对象。所有的基本类型都有一个与之对应的类,例如 Integer类对应基本类型int。通常,这些类被称为包装器。
  • 这些包装类对应基本数据类型:
    Integer , Long , Float , Short , Byte, Charater , Boolen;
    (前六个类派生于公共的超类Number)
  • 包装类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值,同时,包装类还是final,因此不能派生他的子类。

二、拆装箱的使用

1.引入包装类的原因:

包装成对象后更加方便操作,比如可以直接封装一些方法放在类中方便使用:比如,将一个数字字符串s转换成数值 可以使用:int x = Integer.parseInt(s)或者能方便将数据加入集合:假如想要定义一个整型数组列表。遗憾的是,尖括号中的类型参数不允许是基本类型,也就是说,不允许写成如 ArrayList,这里就可以用到Integer 包装类。
我们可以声明一个Integer对象的数组列表:
ArrayList list = new ArrayList()

注:由于每个值分别包装在对象中,所以ArrayList的执行效率远低于int[ ]数组。因此,只有当操作的方便性比执行效率更重要时,才会考虑对较小的集合使用这种构造

2.自动拆装箱的运用

1.对于向ArrayList()中添加int类型的元素 就可以用到自动装箱的特性,下面这个调用:
list.add(3);
将自动变换成:
list.add(Integer.valueOf(3));
这就是 自动装箱(autoboxing)

2.相反的 当将一个Integer对象赋给一个int值时,将会自动拆箱。也就是说,编译器将以下语句:
int n=list.get(i);
转换成:
int n =list.get(i).intValue();
这就是 自动拆箱

3.一些典型举例

1.自动拆装箱适用于算术表达式。例如,可以将自增运算符应用于包装类引用:
Integer n =1;
n++;
编译器将自动插入一条对象拆箱的指令,然后进行自增运算,最后再将结果拆箱。

2.==运算符和包装类联用的注意
(以下内容谈到了 运行时常量池,如果需要搞清楚请移步这篇文章)

传送门  运行时常量池理解

(1)自动装箱常见的就是valueOf这个方法,自动拆箱就是intValue方法。在它们的源码中有一段代码定义了包装类的缓冲区。除了两个包装类Long和Double 没有实现这个缓存技术,其它的包装类均实现了它。
如下代码:

Integer i1 = 40;
Integer i2 = 40;
Double i3 = 40.0;
Double i4 = 40.0;
System.out.println("i1=i2   " + (i1 == i2));
System.out.println("i3=i4   " + (i3 == i4));

-----结果----
true
false

原理如下:
“==” 这个运算在不出现算数运算符的情况下 不会自动拆箱,所以i1 和 i 2它们不是数值进行的比较,仍然是比较地址是否指向同一块内存,在integer源码中缓冲区的范围是-128-127之间,在此范围内只要不new对象,那么数值的地址都是相同的,都在常量池区域。而Double没有设置缓冲区,自然i3 i4的地址不相同。
所以包装类对象比较时最好调用equals方法。

3.(1)由于包装类引用可以为NULL,所以自动装箱有可能会抛出一个NullPointerException异常:
eg:Integer n =null; System.out.println(2*n);
(2)另外,如果在一个条件表达式中混合使用Integer和Double类型,Integer值会拆箱,提升为double再装箱为Double;

引用--《java核心技术卷一》

以上就是java学习之理解自动拆装箱特性的详细内容,更多关于java自动拆装箱的资料请关注我们其它相关文章!

(0)

相关推荐

  • java编程中自动拆箱与自动装箱详解

    什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能. 一般我们要创建一个类的对象实例的时候,我们会这样: Class a = new Class(parameter); 当我们创建一个Integer对象时,却可以这样: Integer i = 100; (注意:不是 int i = 100; ) 实际上,执行上面那句代码的时候,系统为我们执行了:Integer i = Integer.valueOf(100); (感谢@

  • 详解Java 自动装箱与自动拆箱

    包装器 有些时候,我们需要把类似于int,double这样的基本数据类型转成对象,于是设计者就给每一个基本数据类型都配置了一个对应的类,这些类被称为包装器. 包装器整体来说分为四大种: Number,Number类派生出了Integer,Double,Long,Float,Short,Byte这六个小类分别代表了int,double,long,float,short,byte这六种基本数据类型. Character,对应的基本数据类型是char. Void,对应的是关键字void,这个类我们会经

  • Java自动拆装箱简单介绍

    在面试过程中,常常会有面试官问到基础的问题的时候都会问到Java的拆装箱,关于这个问题其实不是很难,但是如果平时进行自学的时候不是注意,就可能一脸懵逼,所以笔者就这个问题进行一些总结,共同促进! 一.拆装箱概念 所谓的拆装箱,就是自从JDK1.5之后,java的基本类型和引用类型之间的相互转换. 1.1拆箱 拆箱就是把Long,Integer,Double,Float 等将基本数据类型的首字母大写的相应的引用类型转化为基本数据类型的动作就叫拆箱. 1.2装箱 装箱就是把byte ,int ,sh

  • 详解Java 自动装箱与拆箱的实现原理

    什么是自动装箱和拆箱 自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱.因为这里的装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱.原始类型byte, short, char, int, long, float, double 和 boolean 对应的封装类为Byte, Short, Character, Integer, Long, Float, Dou

  • 浅谈Java自动装箱与拆箱及其陷阱

    在本文中,笔者向大家介绍下Java中一个非常重要也非常有趣的特性,就是自动装箱与拆箱,并从源码中解读自动装箱与拆箱的原理,同时这种特性也留有一个陷阱.开发者如果不注意,就会很容易跌入这个陷阱. 自动装箱(Autoboxing) 定义 大家在平时编写Java程序时,都常常以以下方式来定义一个Integer对象: Integer i=100; 从上面的代码中,大家可以得知,i为一个Integer类型的引用,100为Java中的基础数据类型(primitive data type).而这种直接将一个基

  • java学习之理解自动拆装箱特性

    目录 一.自动装拆箱是什么? 二.拆装箱的使用 1.引入包装类的原因: 2.自动拆装箱的运用 3.一些典型举例 一.自动装拆箱是什么? 有时,需要将int这样的基本类型转换为对象.所有的基本类型都有一个与之对应的类,例如 Integer类对应基本类型int.通常,这些类被称为包装器. 这些包装类对应基本数据类型: Integer , Long , Float , Short , Byte, Charater , Boolen; (前六个类派生于公共的超类Number) 包装类是不可变的,即一旦构

  • 详谈Java枚举、静态导入、自动拆装箱、增强for循环、可变参数

    一.枚举简介 1.什么是枚举? 需要在一定范围内取值,这个值只能是这个范围内中的任意一个 现实场景:交通信号灯,有三种颜色,但是每次只能亮三种颜色里面的任意一个 2.使用一个关键字 enum enum Color3 { RED,GREEN,YELLOW; } *枚举的构造方法也是私有化的 *特殊枚举的操作 **在枚举类里面有构造方法 **在构造方法里面有参数,需要在每个实例上都写参数 **在枚举类里面有抽象方法 **在枚举的每个实例里面都重写这个抽象方法 3.枚举的api的操作 **name()

  • Java基础教程之基本类型数据类型、包装类及自动拆装箱

    前言 我们知道基本数据类型包括byte, short, int, long, float, double, char, boolean,对应的包装类分别是Byte, Short, Integer, Long, Float, Double, Character, Boolean.关于基本数据类型的介绍可参考Java基础(一) 八大基本数据类型 那么为什么需要包装类? JAVA是面向对象的语言,很多类和方法中的参数都需使用对象,但基本数据类型却不是面向对象的,这就造成了很多不便. 如:List<in

  • Java三目运算中隐藏的自动拆装箱

    最近修改线上bug的时候排查了一个十分隐藏的bug,直接上代码: Integer a = null; boolean flag = true; Integer b = flag ? a : 0; 乍一看是没什么毛病的,但是已运行就会发现报空指针,在idea里面也会警告可能有空指针,这是什么原因呢? 直接看字节码: 0: aconst_null 1: astore_1 2: iconst_1 3: istore_2 4: iload_2 5: ifeq 15 8: aload_1 9: invok

  • 详谈java中int和Integer的区别及自动装箱和自动拆箱

    目录 int和Integer的区别及自动装箱和自动拆箱 Integer和int的对比,如下图所示: 自动装箱和自动拆箱: Integer的自动拆装箱的陷阱(整型数-128到127的值比较问题) 1.先看下面的例子: 2.以下是Integer.valueof()的源代码: int和Integer的区别及自动装箱和自动拆箱 1.Integer是int的包装类,int则是java的一种基本数据类型. 2.Integer变量必须实例化后才能使用,int则不需要. 3.Integer实际是对象的引用,当n

  • Java详细分析讲解自动装箱自动拆箱与Integer缓存的使用

    目录 1. 前言 2. 包装类 3. 自动装箱与自动拆箱 4. Interger缓存 5. 回答题目 1. 前言 自动装箱和自动拆箱是什么?Integer缓存是什么?它们之间有什么关系? 先来看一道题目. Integer a = new Integer(1); Integer b = new Integer(1); System.out.println(a==b); Integer c = 1; Integer d = 1; System.out.println(c==d); Integer e

  • JAVA新手小白学正则表达式、包装类、自动装箱/自动拆箱以及BigDecimal

    目录 1正则表达式Regex 1.1概述 1.2常见语法 1.3String提供了支持正则表达式的方法 1.4练习:测试输入身份证号 2包装类 2.1与基本类型的对应关系 2.2Number 2.3Integer创建对象 2.4练习:Number之Integer 2.5Double 2.5练习:Number之Double 3自动装箱和自动拆箱 3.1概述 3.2练习:自动装箱与自动拆箱测试 4BigDecimal 4.1创建对象 4.2常用方法 4.3练习:测试常用方法 5拓展 总结 1 正则表

随机推荐