java当中Integer==、equals以及cache
博客专区 > getqiu 的博客 > 博客详情
java当中Integer==、equals以及cache
getqiu 发表于1年前
java当中Integer==、equals以及cache
  • 发表于 1年前
  • 阅读 7
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 关于== 和equals网上一搜就能找到一大堆。每次涉及到判断连个String,Integer对象是否相当的时候还是会有点模糊,今天来总结一下

经常遇到 用 `==`比较两个基本类型自动装箱后的对象,有些时候总让人晕,今天总体梳理一下这个问题。

梳理这个问题之前,先来看看最近遇到的一些程序片段:

public void integerCache()
{
    Integer number1 = new Integer(10);
    Integer number2 = new Integer(10);
    System.out.println("number1 == number2:"+(number1 == number2)); //@1

    Integer number3 = 300;
    Integer number4 = 300;
    System.out.println("number3 == number4 :"+(number3 == number4));//@2

    System.out.println("300 == 300 :"+(300 == 300));                //@3

    Integer number5 = Integer.valueOf("67");
    Integer number6 = Integer.valueOf("67");
    System.out.println("number5 == number6:"+(number5 == number6)); //@4

    Integer number7 = Integer.valueOf("128");
    Integer number8 = Integer.valueOf("128");
    System.out.println("number7 == number8:"+(number7 == number8)); //@5
}

遇到的问题大概就是这5类吧,程序输出的结果是这样的:

number1 == number2:false
number3 == number4 :true
300 == 300 :true
number5 == number6:true
number7 == number8:false

一个一个的来分析:

  1. @1 在java当中 `==`对于基本类型来说是判断两个变量的值是否相等(即使类型不同也行,比如21 == 21F),但是对于引用类型,必须是引用地址相等才能算相等,因此@1当中,这个两个引用类型的变量,在堆区的不同位置,因此答案是 false
  2. @2地方比较迷惑人。程序是申明了一个Integer对象,因此在赋值 number3=300时,300会自动装箱,成为Interger(300),又是堆区当中两个不同的对象,所以返回的结果是false。但是:如果把程序中的300改为30,那么结果返回是true?为什么呢?因为在java在初始化Integer时,会自动的缓存(-128,127)的Integer对象,所以当把30自动装箱,那么就会自动引用缓存当中的对象。但是为什么@1当中没有自动引用缓存呢?上面黄色标记的地方说了,在自动装箱的时候才去缓存当中取,没说创建的时候会到缓存当中取。
  3. @3地方,两个基本类型,所以只要值相等,自然就相等了。结果为true。
  4. @4:Integer的valueOf方法也会到缓存当中取对象,而且缓存的范围是(-128,127),故返回值为true,同理@5返回只为false。
  5. @5返回为false。

总之:

遇到这类问题首先要明白的是:

  1. ==判断的依据是什么? `==`对于基本类型来说是判断两个变量的值是否相等(即使类型不同也行,比如21 == 21F),但是对于引用类型,必须是引用地址相等才能算相等。
  2. 当前比较的类型是基本类型还是引用类型?
  3. 如果是引用类型:这两个变量的地址相同吗?(考虑是否被缓存了)

 

大概总结就这样吧,欢迎补充。

标签: java equals 缓存
共有 人打赏支持
粉丝 2
博文 12
码字总数 11145
×
getqiu
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: