2019年08月19日(星期一)  农历:己亥年七月十九

作者:三年。分类: JAVA

一般我们使用数值时,都是使用基本类型,如int、long等,但如果你喜欢使用Integer、Long的包装类,那有一点可就得注意了。先来看下这段代码:

复制代码

/**

*

* @author www.zengto.com

* @date 2016-01-04

*/

public class AutoBoxingTest {

public static final Integer CONST_A = 1;

public static final Integer CONST_B = Integer.valueOf("2");

public static final Integer CONST_C = new Integer(3);

private Integer status;

public void setStatus(Integer status){

this.status = status;

}

public void displayStatus(){

if(status == CONST_A)

System.out.println("It's CONST_A");

else if(status == CONST_B)

System.out.println("It's CONST_B");

else if(status == CONST_C)

System.out.println("It's CONST_C");

else

System.out.println("Invalid status!");

}

public static void main(String[] args) {

AutoBoxingTest abt = new AutoBoxingTest();

abt.setStatus(1);

abt.displayStatus();

abt.setStatus(2);

abt.displayStatus();

abt.setStatus(3);

abt.displayStatus();

}

}

复制代码

执行结果是(jre版本:1.7.0_10):

It's CONST_A

It's CONST_B

Invalid status!

可能有人会奇怪,为什么第三个不输出It's CONST_C呢?其实jre挺懒的,如果发现==两边都是对象,它就直接比较引用,而不是值,跟普通对象一样,因为status为3的那次比较中,两边 是两个不同的对象,所以不相同。而前两个为什么可以呢?是因为IntegerCache的存在,在自动装箱(给CONST_A赋值和 setStatus(int)时)和调用Integer.valueOf(String)时,返回的Integer有时(为什么说是有时?是因为 IntegerCache只对部分数值做了缓存,具体请阅读源码)是从Cache中获取的,所以都是同一个对象,而CONST_C在赋值时是我们自己 new出来的,所以跟Cache中的对象不是同一个。

延伸一下,如果一边是包装类,一边是基本类型时;或者使用了<、>、<=等比较符,都会进行值比较。只有刚好满足引用比较的条件时,jre才会偷懒,直接进行引用比较。所以,定义常量变量时,最好使用基本类型,使用==和!=时多多留意。

ps:文章比较短,我不喜欢重复在网上随便都能搜到的东西,像装箱拆箱,封闭类等。如果本文对你有帮助,还请支持一下

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

已有 0/1235 人参与

发表评论:



手Q扫描加入Java初学者群