java中的自动装箱和自动折箱

转载 2018年04月17日 18:24:34

java的自动装箱和自动折箱

包装类(wrapper)和基本类型(primitive)

  • 基本类型: byte,short,char,int,long,float,double,boolean
  • 包装类为: Byte,Short,Character,Integer,Long,Float,Double,Boolean

自动装箱和自动折箱

  • 自动装箱: 基本类型转成包装类的过程,通过调用包装类的valueOf()方法
  • 自动折箱: 包装类转成基本类型的过程,通过调用包装类的intValue(),doubleValue(),*Value()

对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值 。


Integer a = 23; //自动装箱,相当于 Integer a = Integer.valueOf(23);
int b = a; //自动折箱, 相当于 int b = a.intValue();

经典的问题

@Test
public void integerTest(){
    Integer a=10;
    Integer b=10;
    Integer c=1000;
    Integer d=1000;
    System.out.println("a==b ? : "+ (a==b));
    System.out.println("c==d ? : "+ (c==d));
}
//结果
a == b ? : true
c == d ? : false

分析: 首先a==bc==d比较的是引用;然后a,b,c,d都发生了自动装箱的操作,必然会调用Integer.valueOf()方法,Integer.valueOf()源码:

public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

可以发现: Integer使用IntegerReference缓存了-128~127之间的值:

  • 如果i在-128~127之间,取出的是同一个对象
  • 如果i不在-128~127之间,会重新new一个对象

包装类引用传递

有些人认为包装器类可以用来实现修改数值参数的方法 , 然而这是错误的

public void changeFun(int x){ //没有效果
    x = x+3;
}

//再或者

public void changeFun(Integer x){ //也没有效果
   x = 12;
   // x = new Integer("21");
}

问题是Integer对象是不可变的:包含在包装器中的内容不会改变:不能使用这些包 装器类创建修改数值参数的方法如果想编写一个修改数值参数值的方法,就需要使用在 org.omg.CORBA包中定义的持有者(holder)类型,包括 IntHolder、BooleanHolder等

如:

public void changeFun (IntHolder x ){
    x.value = 10 * x.value;
}

或者是自定义实体类,可以通过自定义实体类的setter方法设值

//PlainString.java
public class PlainString {

    private String value;

    public PlainString(String value) {
        this.value = value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return this.value;
    }
}

public void changeFun (PlainString ps){
    ps.setValue(3);
}

组合语言之艺术3

 第二章    准备工作 第一节  系统一、系统之选择    只因真正了解电脑的人太少,迷信名气的结果,使得 IBM PC/AT占有了市场。为求电脑普及应用,我们唯有因陋就简,针对 IBM PC/AT...
  • dot99
  • dot99
  • 2001-08-04 22:19:00
  • 1334

Java_枚举、自动拆装箱和泛型

Java_枚举和泛型 1.枚举:关键字 enum  问题:对象的某个属性的值不能是任意的,必须为固定的一组取值其中的某一个;  解决办法:  1.在setGrade方法中做判断,不符合格式要求就抛...
  • qq_28511837
  • qq_28511837
  • 2015-05-31 01:07:47
  • 605

详解Java的自动装箱与拆箱(Autoboxing and unboxing)

一、什么是自动装箱拆箱 很简单,下面两句代码就可以看到装箱和拆箱过程 //自动装箱 Integer total = 99; //自定拆箱 int totalprim = total; 简单...
  • hp910315
  • hp910315
  • 2015-09-22 15:27:50
  • 5900

Java自动装箱和自动拆箱

Java自动装箱和拆箱
  • liamao16
  • liamao16
  • 2016-04-27 08:59:58
  • 1068

【Java】Java的==和equals()以及自动装箱拆箱

Java的==和equals()以及自动装箱拆箱Java的和equals以及自动装箱拆箱 抛一个问题 先说一说 和 equals方法equals方法 再说一下Integer的缓存机制 自动装箱和自动...
  • cflys
  • cflys
  • 2017-07-22 11:02:25
  • 1055

Java进阶之自动拆箱与自动装箱

自动装箱:把基本类型用它们对应的包装类包装起来,使它们具有对象的特质,可以调用所对应的包装类所定义的方法,比如toString()等。 自动拆箱:跟自动装箱的方向相反,将Integer及Double...
  • qq_31655965
  • qq_31655965
  • 2016-06-06 18:04:26
  • 2878

Java学习之自动装箱和自动拆箱源码分析

自动装箱(boxing)和自动拆箱(unboxing) 首先了解下Java的四类八种基本数据类型 基本类型 占用空间(Byte) 表示范围 包装器类型 ...
  • u011726984
  • u011726984
  • 2015-08-27 18:56:17
  • 7514

Java_自动装箱_自动拆箱和String常量池(享员模式应用)

本博文为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/8932855 1.自动装箱与拆箱的理解    自动装箱:基本...
  • strawberry2013
  • strawberry2013
  • 2013-05-15 23:06:51
  • 2482

JAVA比较陷阱——易错点(包含自动装箱)

一、预备知识 Java把内存划分成两种:一种是栈内存,另一种是堆内存。int 是基本类型,直接存数值,而 Integer是类,产生对象时用一个引用指向这个对象 。包装器(wrapper)——...
  • fanxiaobin577328725
  • fanxiaobin577328725
  • 2016-09-04 22:00:52
  • 1478

从原理剖析自动拆装箱

前言:自动拆装箱是JDK1.5的新特性,这一特性使得基本类型与对应的包装器类型(引用类型)之间能够直接进行互相转换,例如将int类型与Integer类型,我们可以将int类型当做Integer类型来使...
  • fightfaith
  • fightfaith
  • 2015-12-13 10:01:41
  • 1505
收藏助手
不良信息举报
您举报文章:java中的自动装箱和自动折箱
举报原因:
原因补充:

(最多只允许输入30个字)