美文网首页程序员
Java - Integer自动拆箱封箱的问题

Java - Integer自动拆箱封箱的问题

作者: 夹胡碰 | 来源:发表于2021-01-04 19:50 被阅读0次

Integer在与Integer比较的时候是比较内存地址,Integerint比较的时候Integer会产生自动拆箱进行值比较,如果使用不当,这期间就会产生一些不易察觉的问题,下面将详细介绍。

先看一个Integer缓存样例

public static void main(String[] args) {
    Integer a0 = 100;
    Integer b0 = 100;
    System.out.println(a0== b0);
    // out => true

    Integer a1 = 1000;
    Integer b1 = 1000;
    System.out.println(a1 == b1);
    // out => false
}

有很多资料可以说明原理,这里不再赘述,这里想说的是Integer自动拆箱封箱有很多需要注意的点,这些点都比较隐蔽,使用稍有不慎就会埋藏bug,切不易发现。
下面介绍几种拆箱问题

1. 方法参数使用int

因为一般PO、DTO都是使用Integer,所以在方法调用的时候会产生NullPointerException异常,解决办法是方法参数使用Integer

public class Main{

    static Integer a  = null;

    public static void main(String[] args) {
        test(a); // java.lang.NullPointerException 异常
    }

    public static void test(int aaa){
        System.out.println(aaa);
    }
}
2. 枚举使用Integer

枚举使用Integer与实体类的Integer比较时,就会出现地址比较,而这常会被误使用为值比较,埋藏bug。
解决办法为枚举使用int类型。

public class Main{

    static Integer a  = null;

    public static void main(String[] args) {
        Integer status = 1000;
        System.out.println(status == StatusEnum.Error.getCode()); // out => false
    }

    public enum StatusEnum{

        Error(1000);

        private Integer code;

        StatusEnum(Integer code) {
            this.code = code;
        }

        public Integer getCode() {
            return code;
        }
    }
}

相关文章

  • Java - Integer自动拆箱封箱的问题

    Integer在与Integer比较的时候是比较内存地址,Integer与int比较的时候Integer会产生自动...

  • java Integer包装类之自动装拆箱 + Integer

    java Integer包装类之自装拆箱 + Integer == (缓存池)面试题 Integer 自动装拆箱 ...

  • (Note) Java-autoBoxing-unBoxing

    0. Thanks Java中的自动装箱与拆箱 Java 自动装箱与拆箱的实现原理 Integer.java 1....

  • 装箱与拆箱详解笔记

    1、什么是自动装箱与拆箱 //自动装箱Integer integer = 100;//自动拆箱int i = in...

  • 拆箱 装箱

    注意:// jdk1.5 以后 自动装箱 自动拆箱Integer integer = 12; // ...

  • java 自动装箱 拆箱 常量池

    java的自动装箱拆箱是jdk1.5后引入的内容,装拆过程由编译器自动完成。其中,java对Integer的自动装...

  • jdk5新特性

    自动装箱与拆箱 // 自动装箱:值转对象Integer n = 1;// 自动拆箱:对象转值int m = n; ...

  • 算法1.3

    Java 应用类型必须被实例化为引用类型,即封装类型(如int-》Integer)自动装箱自动拆箱 背包:一种不支...

  • 阿里编程规范内含细节

    1.Integer类型比较 当比较Integer和int的时候Integer类型会自动拆箱,调用intValue(...

  • 七 int Integer

    1 int和Integer JDK1.5引入了自动装箱与自动拆箱功能,Java可根据上下文,实现int/Integ...

网友评论

    本文标题:Java - Integer自动拆箱封箱的问题

    本文链接:https://www.haomeiwen.com/subject/ofzvoktx.html