android错误之==与equals的区别

在做一个电话号码匹配的时候,开始我使用的是这种情况if (num == inCall.getNum()) {//操作…}但是无论如何结果都是false,就算两个号码打印出来一模一样还是false,突然想起来错在哪里了,改成如下if (num.equals(call.getNum())) {//操作…}结果不言而喻,正确了,这就是==和equals的区

大家好,又见面了,我是全栈君。

在做一个电话号码匹配的时候,

开始我使用的是这种情况

if (num == inCall.getNum()) {
//操作...
}

但是无论如何结果都是false,就算两个号码打印出来一模一样还是false,

突然想起来错在哪里了,改成如下

if (num.equals(call.getNum())) {
//操作...
}

结果不言而喻,正确了,这就是==和equals的区别了:

简单来说就是,==比较的是值,如果是int,long,或者float当然正确,只要值相等就相等了,

而equals比较的是实际的值,比如对于上面两个引用来说,他们的地址是不同,但是地址里存放的内容是相同的,

那么这时候用==比较就会得到false,用equas比较就得到true

表达能力不好,如果看不懂的话看下面的例子,看得懂的话就到此为止吧,别往下浪费时间了.

 

下面举例说明:

public class Equivalence {
  public static void main(String[] args) {
    Integer n1 = new Integer(47);
    Integer n2 = new Integer(47);
    System.out.println(n1 == n2);
    System.out.println(n1 != n2);
  }
}

表达式System.out.println(n1 == n2)可打印出内部的布尔比较结果。一般人都会认为输出结果肯定先是true,再是false,因为两个Integer对象都是相同的。但尽管对象的内容 相同,句柄(可以理解为两个对象在内存中的地址)却是不同的,而==和!=比较的正好就是对象句柄。所以输出结果实际上先是false,再是true。这 自然会使第一次接触的人感到惊奇。
若想对比两个对象的实际内容是否相同,又该如何操作呢?此时,必须使用所有对象都适用的特殊方法equals()。但这个方法不适用于“主类型”,那些类型直接使用==和!=即可。下面举例说明如何使用:

public class EqualsMethod {
  public static void main(String[] args) {
    Integer n1 = new Integer(47);
    Integer n2 = new Integer(47);
    System.out.println(n1.equals(n2));
  }
}

正如我们预计的那样,此时得到的结果是true。但事情并未到此结束!假设您创建了自己的类,就象下面这样:

class Value {
  int i;
}

public class EqualsMethod2 {
  public static void main(String[] args) {
    Value v1 = new Value();
    Value v2 = new Value();
    v1.i = v2.i = 100;
    System.out.println(v1.equals(v2));
  }
} 

此时的结果又变回了false!这是由于equals()的默认行为是比较句柄。所以除非在自己的新类中改变了equals(),否则不可能表现出我们希望的行为。但要注意equals()的这种行为方式同时或许能够避免一些“灾难”性的事件。
对于Object类,它提供了一个最最严密的实现,那就是只有是同一对象是,equals方法才返回true,也就是人们常说的引用比较而不是值比较。这个实现严密得已经没有什么实际的意义,所以在具体子类(相对于Object来说)中,如果我们要进行对象的值比较,就必须实现自己的equals方法。
大多数Java类库都实现了equals(),所以它实际比较的是对象的内容,而非它们的句柄。

作者:jason0539

微博:http://weibo.com/2553717707

博客:http://blog.csdn.net/jason0539(转载请说明出处)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121397.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • webstorm好用的插件_谷歌浏览器插件推荐

    webstorm好用的插件_谷歌浏览器插件推荐安装插件codeglance可以实现VSCode的右侧小地图

    2025年10月10日
    2
  • Django(27)Django类视图添加装饰器

    Django(27)Django类视图添加装饰器类视图在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图。使用类视图可以使用类的一些特性,比如继承等。Viewdjango.views.generic.base.View是主

    2022年7月30日
    6
  • SD卡中FAT32文件格式高速入门(图文具体介绍)

    SD卡中FAT32文件格式高速入门(图文具体介绍)

    2021年12月6日
    122
  • 对计算机专业来说学历真的重要吗?

    对计算机专业来说学历真的重要吗?我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。目录:张雪峰讲述的事实 我看到的事实 为什么会这样…

    2022年5月28日
    96
  • 一套键盘鼠标跨电脑切换使用「建议收藏」

    一套键盘鼠标跨电脑切换使用「建议收藏」       身为一名涉猎领域广泛的码农,工作间中往往会出现同时使用超过一台电脑的场景,笔记本+台式机基本是常态,甚至会出现Win+MAC或者Win+LINUX这样的跨平台同时操作需求。那么最令人烦恼的莫过于切换使用电脑时需要来回切换键鼠,如果可以用桌面上的一套键鼠,实现对多台电脑的无缝操作切换,岂不是美滋滋。      博主这样的愿望由来已久,今日终于完美解决,特分享给诸位道友。  …

    2022年10月10日
    3
  • 电容分类_电解电容和薄膜电容的区别

    电容分类_电解电容和薄膜电容的区别一、按照功能  1.名称:聚酯(涤纶)电容   符号:(CL)  电容量:40p–4μ  额定电压:63–630V  主要特点:小体积,大容量,耐热耐湿,稳定性差  应用:对稳定性和损耗要求不高的低频电路  2.名称:聚苯乙烯电容  符号:(CB)  电容量:10p–1μ  额定电压:100V–30KV

    2022年8月22日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号