今天在测试代码的时候,同事问我新加的一段逻辑出现了空指针异常
看了下,是很久前自己写的代码,int和Integer对象比较的时候,用了==在不传Integer的情况下,会出现空指针异常。查资料回忆了一下,int和Integer的比较关注重点
1.Integer是int的封装类,int与Integer比较时,Integer会自动拆箱,如果都有相同的值(比如100)无论怎么比,int与Integer都相等。
2.查看java源代码可知道,Integer比较时,在-128与127之间,Integer会自动存在内存中,再有时,直接从内存中去取,不在这个范围则会new新对象,所以Integer a=100,Integer b=100,a==b是返回true的
同时Integer与new Integer永远都不相等。
范例
int a=127;int b=127;Integer c = 127;Integer d = new Integer(127); Integer e=127;
a==b true; a==c;true c==d;false; a==d;true; c==e true;
int a=128;int b=128;Integer c=128;Integer d=128;Integer e = new Integer(128);
a==b true; a==c true; a==e true; c==d false; c==e false;
java的自动装箱与自动拆箱
自动装箱就是将基本数据类型转换为包装器类型,自动拆箱就是将包装器类型转为基本数据类型。
装箱过程系统执行了Integer.valueOf(99);
在-128到127范围,会生成同一个对象,在范围之外,会执行new Integer(99);
装箱的过程会创建对应的对象,这个会消耗内存,所以装箱的过程会增加内存的消耗,影响性能
拆箱过程执行了int totlprim = total.intValue();
直接返回value
参照:https://blog.csdn.net/yuanjianqiang_0925/article/details/84060825