前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你所不知道的 equals()

你所不知道的 equals()

作者头像
PhoenixZheng
发布2018-08-07 16:18:05
2930
发布2018-08-07 16:18:05
举报
文章被收录于专栏:Phoenix的Android之旅

在基本运算符中, == 扮演一个重要的角色, 而跟它相似的还有个 equals()方法, 这两个的区别是什么你知道么。

来看个例子

来看下面这段代码

代码语言:javascript
复制
String a = "abc"
String b = "abc";
String c = new String(“abc”);

下面用两种方法来比较,

代码语言:javascript
复制
boolean resultA = a == b;
booolean resultB = a.equals(b);
boolean resultC = a == c;

这里的结果是,

resultA == true; resultB == true; resultC == false;

比较容易产生疑惑的地方是 a 跟 c用 == 来比较的时候,为什么会是 false? 如果换成 eqauls的话,

代码语言:javascript
复制
boolean resultD = a.equals(c);

resultD则是 true的。 下面分析下原因。

== 和 eqauls的实质

其实,== 对比的是内存地址, 而 equals()在没有重写的情况下,对于复合类型来说,也是对比的内存地址, 如果对于复合类型,可以重写 eqauls方法来定义匹配的规则。

以这个原则,回到上面的例子中。

代码语言:javascript
复制
String a = "abc"
String b = "abc";

当我们定义了一个 a之后,其实会在内存里开辟一块地方用来存放字符串, 第二次再实例化一个 String对象时,如果缓存池中已经有字符串了,则直接让新对象引用原有的内存地址。 所以如果用 == 来比较的话, 因为 String不是基本类型,所以直接比较两个的内存地址的情况下是 true 的。

而为什么 resultC 是 false呢? 因为当我们用 new String("abc") 来实例化新的对象的时候, 即使内存池已经有 "abc" 了,因为 new 操作符的存在, 还是会开辟一个内存地址来存放新的对象, 所以用 == 来比较 a 跟 c 的话, 结果是 false的。

equals() 是什么情况呢

equals()是 Object的一个方法, 像 String这种非基本类型是可以重载 equals()来定义自己的匹配逻辑的。 所以可以在上面的例子看到, 虽然 c 引用了跟 a 不一样的内存地址, 但是在用 eqauls来比较的情况下, 因为两者的内容相同,所以结果是 true的。

下面贴下 String的 equals方法就明白了

代码语言:javascript
复制
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String) anObject;
        int n = length();
        if (n == anotherString.length()) {
            int i = 0;
            while (n-- != 0) {
                if (charAt(i) != anotherString.charAt(i))
                        return false;
                i++;
            }
            return true;
        }
    }
    return false;
}
总结

在Java中进行比较的话, 如果是基本类型,用 == 就可以。 但是如果是复合类型,像 String 这种, 甚至于自定义类, 如果想要比较的话,单纯用 == 是不行的,必须重载 equals来实现比较的逻辑。

说到这里, 顺便说一个有趣的东西,

代码语言:javascript
复制
public class Demo {
    public static void main(String[] args) {
      Integer a = 128;
      Integer b = 128;
      System.out.println("result: " + (a == b));
    }
}

这里的结果是 false。

呵呵呵呵… 明天再说为什么。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 来看个例子
  • == 和 eqauls的实质
  • equals() 是什么情况呢
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档