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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • uniapp页面跳转传参_uni怎么做api跳转

    uniapp页面跳转传参_uni怎么做api跳转今天看Dcloud官网更新了个uni-app,据说一套代码三端发布(Android,iOS,微信小程序),果断一试。uni.navigateTo(OBJECT)保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。OBJECT参数说明参数 类型 必填 说明 url String 是 需要跳转的应用内非…

    2022年8月13日
    5
  • C语言 getchar()原理及易错点解析

    C语言 getchar()原理及易错点解析文章目录一.getchar()系列1.getchar()工作原理及作用2.使用getchar()清理回车\n3.使用getchar()清理缓存一.getchar()系列1.getchar()工作原理及作用工作原理:getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了,第一次getchar()时,…

    2022年10月19日
    1
  • 几个国外SPS技术网站

    几个国外SPS技术网站http://www.tech-archive.net/Archive/SharePoint/microsoft.public.sharepoint.portalserver.development/http://weblogs.asp.net/autocrat/archive/2004/11/10/254825.aspxhttp://www.mev.com/modules/lists/msft/…

    2022年6月22日
    35
  • SQL SERVER的QUOTENAME函数

    SQL SERVER的QUOTENAME函数quotename使函数中的输入成为一个有效的标识符selectQUOTENAME(‘dddd’) 返回[dddd]selectQUOTENAME(‘dddd’,'”‘)返回”dddd”首先,sqlserver里的标识符有一定的规则,比如 你 createtableabc123(…) 那么中间含有空格,它不是符合规则的。 

    2022年7月25日
    11
  • 什么是跨域跨域解决方法_500错误原因解决方法

    什么是跨域跨域解决方法_500错误原因解决方法一、为什么会出现跨域问题出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协…

    2022年4月18日
    486
  • 技术文章收集_技术博客

    技术文章收集_技术博客http://www.mianwww.com/html/category/company-list/ibmIT公司面试手册http://www.miansou.com/news.html面试经验搜索http://www.ucdchina.com/专业UED设计网站http://blog.zhaojie.me/老赵新博客地址htt…

    2022年9月30日
    0

发表回复

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

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