java 自动装箱、拆箱

# java 自动装箱、拆箱

jdk 1.5 版本开始, 引入该功能。

一、自动装箱

基本数据类型自动封装为对应封装类。

代码示例,

Integer i = 100;

100属于基本类型int,会自动装箱,如下:

Integer i = Integer.valueOf(100);

相当于,

Integer i = new Integer(100);

二、自动拆箱

将封装类自动转换为对应的基本数据类型

代码示例,

Integer i = new Integer(100);
int j = i;

i属于封装类Integer,会自动拆箱,如下:

Integer i = new Integer(100);
int j = i.intValue();

三、问题

  • 三目运算符

问题代码(会引起NPE问题),

Map<String, Boolean> map = new HashMap<String, Boolean>();
Boolean b = (map != null ? map.get("test") : false);

问题原因:三目运算符第二、三操作数类型不同(一个为对象,一个为基本数据类型),会将对象自动拆箱为基本数据类型。

拆箱过程,

Map<String, Boolean> map = new HashMap<String, Boolean>();
Boolean b = Boolean.valueOf(map != null ? map.get("test").booleanValue() : false);

问题解决,

Map<String, Boolean> map = new HashMap<String, Boolean>();
Boolean b = (map != null ? map.get("test") : Boolean.FALSE);
  • Integer

相关代码,

Integer int1 = 100;
Integer int2 = 100;
Integer int3 = 300;
Integer int4 = 300;

// true
System.out.println(int1 == int2);
// false
System.out.println(int3 == int4);

引起问题原因:装箱调用了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);
}

IntegerCache源码如下,

private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];

    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            int i = parseInt(integerCacheHighPropValue);
            i = Math.max(i, 127);
            // Maximum array size is Integer.MAX_VALUE
            h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
        }
        high = h;

        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);
    }

    private IntegerCache() {}
}

未进行特别设置,IntegerCache.high取值为127。因此,通过Integer.valueOf()方法创建Integer对象的时候,如果数值在[-128,127]之间,返回IntegerCache.cache中对象的引用,否则创建一个新的Integer对象。

原文地址:https://www.cnblogs.com/wscy/p/9176850.html

时间: 2024-10-10 02:33:26

java 自动装箱、拆箱的相关文章

java自动装箱拆箱总结

对于java1.5引入的自动装箱拆箱,之前只是知道一点点,最近在看一篇博客时发现自己对自动装箱拆箱这个特性了解的太少了,所以今天研究了下这个特性.以下是结合测试代码进行的总结. 测试代码: int a = 1; Integer b = 1; Integer c = 1; Integer d = 2; Integer e = 3; Integer f = 128; Integer g = 128; Long h = 3L; Double m = 4.0; Double n = 4.0; Float

Java自动装箱拆箱

一.装箱.拆箱定义 如果一个int型量被传递到需要一个Integer对象的地方,那么,编译器将在幕后插入一个对Integer构造方法的调用,这就叫做自动装箱.而如果一个Integer对象被放到需要int型量的地方,则编译器将幕后插入一个队intValue方法的调用,这就叫做自动拆箱. public static void main(String[] args) { // 装箱 Integer i1 = Integer.valueOf(1); // 自动装箱 Integer i2 = 1;// 默

那些年一起踩过的坑 — java 自动装箱拆箱问题

坑在哪里? 我们都知道Java的八种基本数据类型:int, short, long, double, byte, char, float, boolean 分别有各自对应的包装类型:Integer, Short, Long, Double, Byte, Character, Float, Boolean 并且二者之间可以相互直接赋值,例如: 1 // 基本数据类型赋值给封装类 2 inta = 1; 3 Integer b = a; 4 // 封装类型赋值给基本数据类型 5 Character

[Java5新特性]自动装箱/拆箱

自动装箱/拆箱概述 Java中具有基本类型(int,double,float,long,boolean,char,byte,short)和基本类型包装类(Integer,Double,Float,Long,Boolean,Char,Byte,Short),我们实现基本类型与包装类之间的转换基本有两种方式: 一种为JDK5之前的方式,比如Integer i = Integer.valueof(5);(这里5为基本类型int,Integer包装类利用valueof()方法将其转换为Integer类型

Java自动装/拆箱下,三目运算符的潜规则

最近发现了一个很诡异的NullPointerException,在下面这个方法抛出,一开始怎么都没想明白,dSrc即使为null,那直接赋值给distinct也没问题啊. private Doubledistinct; private void setParam(Double dSrc, boolean flag) { this.distinct = (flag) ? dSrc : 0d; } 最后才发现是Java自动拆箱的潜规则,下面我们来看看其所以然. 自动装箱/拆箱 在JDK1.5引入自动

基本类型包装类、自动装箱拆箱

基本类型包装类 public class Demo03 { public static void main(String[] args) { //字符串转基本数据类型 String str="12"; int strint=Integer.parseInt(str); System.out.println(strint+1);  //13 String s2="2.3"; double dou=Double.parseDouble(s2); System.out.p

黑马程序员——【Java高新技术】——JDK1.5新特性:静态导入、可变参数、增强型for循环、自动装箱拆箱、枚举

一.静态导入 1.import和import static区别: (1)import 是导入一个类或某个包中所有的类. (2)import static是导入一个类中的某个静态方法或所有的静态方法. 注:在调用静态导入的类的静态方法时,可以不用再写类名.如Arrays.sort(int[])可以直接写sort(int[]); 2.静态导入的写法: (1)import static java.util.Arrays.*;   表示导入Arrays类中的所有静态成员. (2)import stati

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

抛一个问题 大家先看下面的代码,先不要看答案自己做一下: public class AutoboxingTest { public static void main(String[] args) { Integer a = 1; Integer b = 2; Integer c = 3; Integer d = 3; Integer e = 321; Integer f = 321; Long g = 3L; System.out.println(c == d); System.out.prin

java基础1.5版后新特性 自动装箱拆箱 Date SimpleDateFormat Calendar.getInstance()获得一个日历对象 抽象不要生成对象 get set add System.arrayCopy()用于集合等的扩容

8种基本数据类型的8种包装类 byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean Integer a=127; Integer b=127;//虚拟机自动装箱时进行了特殊处理,-127~128以下的自动取有过的 System.out.println(a==b);结果为true 如果是Integer a=128; Integer b=128; Sys

JDK5.0新特性-自动装箱/拆箱

lJDK5.0的语法允许开发人员把一个基本数据类型直接赋给对应的包装类变量, 或者赋给 Object 类型的变量,这个过程称之为自动装箱. l自动拆箱与自动装箱与之相反,即把包装类对象直接赋给一个对应的基本类型变量. l典型应用: List list = new ArrayList(); list.add(1); int j = (Integer)list.get(0); package cn.itcast.autobox; import java.util.ArrayList; import