【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()是值比较,而==依然是内存地址比较。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。