黑马程序员技术交流社区
标题: equals()和==初探 [打印本页]
作者: 艾韦火 时间: 2016-7-3 21:56
标题: equals()和==初探
==:这个是关系运算符,运算结果为一个boolean型的值,而==其比较的是双等号两边的值是否相等,对于基本数据类型的变量就直接比较两值是否相等即可;对于引用数据类型变量,比较的则为两变量的“值”。这里的用“值”是因为,引用数据类型的变量名所存储的是该对象的地址,而不是对象的内容。所以,使用==来比较引用数据类型的时候实质是比较地址值。
equals():这个会有些不同,对于继承Object类的子类和一些重写了该方法的之类会
equals和==初探.pdf
(346.13 KB, 下载次数: 35)
用不一样的结果(比如String类),先来看一下这个方法在Object类中的源码:
* @param obj the reference object with which to compare.
* @return {@code true} if this object is thesame as the obj
* argument; {@code false} otherwise.
* @see #hashCode()
* @see java.util.HashMap
*/
public boolean equals(Object obj) {
return (this == obj);
}
再来看看String类中的equals()方法:、
* @param anObject
* The object to compare this {@codeString} against
*
* @return {@code true} if the given object
represents a {@code String}
* equivalent to this string,{@code false} otherwise
*
* @see #compareTo(String)
* @see #equalsIgnoreCase(String)
*/
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 != v2)
return false;
i++;
}
return true;
}
}
return false;
}
到这里就可以看得出来,在Object中的equals()方法是使用==实现判断的,那实质就是判断变量本身的值了。而在String中则重写了该方法。从重写的方法中可以看得出,该方法对传递进来的变量进行各层比较,最后得到结果,其过程可以分析一下:(本对象.equals(参数))
1、 先判断是否和本对象的地址相同,如果相同则返回true
2、 判断是否是属于String类,如果不是那就肯定不相同,返回false
3、 将参数强转为String类型;获得本对象的长度(具体如何获得,可查阅String.Java源文件),然后判断本对象长度和参数的长度是否相同,如果不同则跳出if并返回false
4、 获取本类的字符型数组和参数的数组,并对两个数组的每一个元素进行比较,如果每一个都一样则返回true,否则就返回false。
看到这里就不难看出,对于equals()方法,对于String的比较,并不是和Object类中的一样,这里是比较对象的内容。
attach://equals和==初探.pdf
作者: 糊图 时间: 2016-7-3 23:20
很多方法其他类中都会对其进行重写,像equals hashcode以及tostring方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |