java 自动拆箱的陷阱

java  自动拆箱运用非常广泛。但是这里面有一些“陷阱”。废话不多说,来看一段代码:

public static void main(String[] args) {
	Integer a=1;
	Integer b=2;
	Integer c=3;
	Integer d=3;
	System.out.println(c==(a+b));
	System.out.println(c==d);
	System.out.println(c.equals(d));
	Integer f=200;
	Integer e=200;
	System.out.println(e==f);
	System.out.println(e.equals(f));
}

打印结果:

true

true

true

false

true

如果说以上的运算都进行自动拆箱那打印的结果应该都是true。在这里先说明一下== 符号并不会发生自动拆箱,所以也就出现了以上的问题。但是仔细观察一下,就有人会说,那不是明明c==d吗?为了解开谜团,我们必须要了解这个装箱过程。我们来看一下对以上代码的反汇编结果:

从以上的代码片段可以发现,原来是调用了Integer.valueOf这个类方法。我们来看一下这个类方法:

  /**
     * Returns a {@code Integer} instance for the specified integer value.
     * <p>
     * If it is not necessary to get a new {@code Integer} instance, it is
     * recommended to use this method instead of the constructor, since it
     * maintains a cache of instances which may result in better performance.
     *
     * @param i
     *            the integer value to store in the instance.
     * @return a {@code Integer} instance containing {@code i}.
     * @since 1.5
     */
    public static Integer valueOf(int i) {
        return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
    }
    /**
     * A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing
     */
    private static final Integer[] SMALL_VALUES = new Integer[256];

看到以上的代码,我相信清楚了为什么会发生以上的结果了。因为缓存了[-128,127] 。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 11:19:51

java 自动拆箱的陷阱的相关文章

java自动拆箱装箱易导致的两个错误

自J2SE 5.0开始提供的基本数据类型的自动装箱(autoboxing).拆箱(unboxing)功能. 何为自动装箱: 当我们创建一个Integer对象时,却可以这样: Integer i = 100; (注意:不是 int i = 100; ) 实际上,执行上面那句代码的时候,系统为我们执行了:Integer i = new Integer(100); 此即基本数据类型的自动装箱功能. 何为自动拆箱 自动拆箱(unboxing),也就是将对象中的基本数据从对象中自动取出.如下可实现自动拆箱

Java 自动拆箱

public static void main(String[] args) { UnBoxing(); } public static Long getLong(){ Long a=null; return a; } public static void UnBoxing(){ // 自动拆箱,由于a为Null // 会调用Integer.intValue方法自动拆箱包装器类型为基本数据类型. long b=getLong();// 出现 NullPointerException System

关于Java自动拆箱装箱中的缓存问题

1 package cn.zhang.test; 2 /** 3 * 测试自动装箱拆箱 4 * 自动装箱:基本类型自动转为包装类对象 5 * 自动拆箱:包装类对象自动转化为基本数据类型 6 * 7 * 8 * /*缓存问题*/ 9 /*缓存[-128,127]之间的数字,也就是一个byte,实际上是系统在初始的时候创建了一个范围在[-128,127]之间的一个数组 10 * 当我们调用valueOf的时候,首先判断该数字是否在[-128,127]之间,如果在,则在数组中拿出该对象,侧面印证了数组

java 自动拆箱与装箱(基本数据类型与引用类型)

(本文章不为原创文章,摘抄,忘记了出处,抱歉) 1.Java数据类型 在介绍java的自动装箱和拆箱之前,我们先来了解一下Java的基本数据类型. 在Java中,数据类型可以分为两大种,Primitive Type(基本类型)和Reference Type(引用类型).基本类型的数值不是对象,不能调用对象的toString(). hashCode().getClass().equals()等方法.所以Java提供了针对每种基本类型的包装类型.如下: INDEX 基本类型 大小 数值范围 默认值

Java语法糖2:自动装箱和自动拆箱

一开始想学学自动拆箱和自动装箱是被这个名字吸引到,听上去好像很高端的样子,其实自动拆箱.自动装箱是很简单的内容. 自动拆箱和自动装箱 Java为每种基本数据类型都提供了对应的包装器类型.举个例子: public class TestMain { public static void main(String[] args) { Integer i = 10; } } 这个过程中会自动根据数值创建对应的Integer对象,这就是自动装箱.再看另外一段代码: public class TestMain

自动装箱与拆箱及其陷阱

自动装箱(Autoboxing): 在jdk 1.5之前,如果你想要定义一个value为100的Integer对象,则需要这样做:Integer aa = new Integer (100);而在jdk 1.5中,自动装箱首次被引入.例如 Integer aa = 100; aa为一个Integer类型的引用,100为Java中的基础数据类型(int).而这种直接将一个基础数据类型传给其相应的封装类的做法,便是自动装箱. 再看下源码里Integer类的valueOf(int i)方法的具体实现,

Java的自动拆箱和装箱

Java 1.5中引入了自动装箱和拆箱机制 自动装箱:(看代码) <span style="font-family:SimSun;font-size:18px;color:#000000;">//自动装箱:把基本类型用它们所对应的引用类型包装起来,使它们具有对象的属性 Integer integer_a = 8; </span> 自动拆箱:(看代码) <span style="font-family:SimSun;font-size:18px;c

别说你不知道java中的包装类,wrapper type,以及容易在自动拆箱中出现的问题

很多时候,会有人问你,你知道什么是包装类吗? 或者高端一点问你你知道,wrapper type,是什么吗? 然后你就懵逼了,学了java很多时候都不知道这是啥. 其实问你的人,可能只是想问你,java面向对象你理解的怎么样. 在java中很多时候我们都说一切皆对象. 但是int,double,总有几个特例告诉你,他不是对象. 但是很多时候我们需要对象,而不是int,但是需要像int一样的对象. 举个例子就是,你需要在List中使用int,但是List只能放对象.类似的问题还有很多哦. 于是jav

java 自动装箱和自动拆箱

自动装箱 java执行Integer i = 100:编译器编译成Integer i = Integer.valueOf(100); 1 Integer i = 100; 2 //编译器编译成Integer i = Integer.valueOf(100); 自动拆箱 java执行 1 Integer i = 100; 2 int j = i; 3 //编译器编译成int j = i.intValue(); 参考: http://www.cnblogs.com/danne823/archive/