【Android一般进阶】引用数据类型euqals()与==作用相同

来源:互联网 发布:暴漫官方淘宝店是哪个 编辑:程序博客网 时间:2024/06/06 09:29

在面试中,经常会被问到euqals()与==有什么区别,估计很多人都会回答:前者是比较值,后者是比较内存地址,其实这只对了一般吧,我感觉。

首先==确实是比较对象的内存地址,这个毫无疑问,而euqals()呢?

其实euqals()是object类中的一个方法,查看源码:

    public boolean equals(Object o) {        return this == o;    }

原来euqals()也是做了==运行。是不是跟很多人想的不太一样呢?至少跟我原来想的不太一样。

而为什么会说euqals()是值比较呢?其实euqals()这个方法是可以被重写的,而String,Integer就重写了它。

先看看String 的euqals()是怎么样的,

     public boolean equals(Object anObject) {         if (this == anObject) {             return true;         }         if (anObject instanceof String) {             String anotherString = (String) anObject;             int n = value.length;             if (n == anotherString.value.length) {                 char v1[] = value;                 char v2[] = anotherString.value;                 int i = 0;                 while (n-- != 0) {                     if (v1[i] != v2[i])                            return false;                     i++;                }                 return true;             }         }        return false;     }
核心是每个字符作比较。

再来看看Integer的euqals()

    @Override    public boolean equals(Object o) {        return (o instanceof Integer) && (((Integer) o).value == value);    }
核心也是值比较。

所以,得出结论如下:

1.在没有重写euqals()的情况下,==与euqals()得到的结果是一样的,都是内存地址比较。

2.在String,Integer类中,因为重写了euqals(),所以euqals()是值比较,而==依然是内存地址比较。



1 0