码迷,mamicode.com
首页 > 其他好文 > 详细

s == t 何解?

时间:2020-07-08 13:48:31      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:ble   alt   info   内容   引用   java   boolean   之间   原因   

Integer s=new Integer(9);
Integer t=new Integer(9);
Long u=new Long(9);
 
 
(s==t) 这个是错的,只要有new这个关键字,就是开辟空间,用的是引用
技术图片

 

 



Integer s =9;
Integer t =9;
(s==t) 这个是对的,在【-128,127】有缓存,指向同一个引用
技术图片

 

 



  • int和int之间,用==比较,肯定为true。基本数据类型没有equals方法
  • int和Integer比较,Integer会自动拆箱,== 和 equals都肯定为true
  • int和new Integer比较,Integer会自动拆箱,调用intValue方法, 所以 == 和 equals都肯定为true
  • Integer和Integer比较的时候,由于直接赋值的话会进行自动的装箱。所以当值在[-128,127]中的时候,由于值缓存在IntegerCache中,那么当赋值在这个区间的时候,不会创建新的Integer对象,而是直接从缓存中获取已经创建好的Integer对象。而当大于这个区间的时候,会直接new Integer。
    当Integer和Integer进行==比较的时候,在[-128,127]区间的时候,为true。不在这个区间,则为false
    当Integer和Integer进行equals比较的时候,由于Integer的equals方法进行了重写,比较的是内容,所以为true

  • Integer和new Integer : new Integer会创建对象,存储在堆中。而Integer在[-128,127]中,从缓存中取,否则会new Integer.
    所以 Integer和new Integer 进行==比较的话,肯定为false ; Integer和new Integer 进行equals比较的话,肯定为true

  • new Integer和new Integer进行==比较的时候,肯定为false ; 进行equals比较的时候,肯定为true
    原因是new的时候,会在堆中创建对象,分配的地址不同,==比较的是内存地址,所以肯定不同

  • 装箱过程是通过调用包装器的valueOf方法实现的
    拆箱过程是通过调用包装器的xxxValue方法实现的(xxx表示对应的基本数据类型)

  • 总结:Byte、Short、Integer、Long这几个类的valueOf方法实现类似的。所以在[-128,127]区间内,==比较的时候,值总是相等的(指向的是同一对象),在这个区间外是不等的。
    而Float和Double则不相等, Boolean的值总是相等的

s == t 何解?

标签:ble   alt   info   内容   引用   java   boolean   之间   原因   

原文地址:https://www.cnblogs.com/albertshine/p/13266106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!