【Android一般进阶】引用数据类型euqals()与==得到结果是一样的

在面试中,经常会被问到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()是值比较,而==依然是内存地址比较。



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。