==:这个是关系运算符,运算结果为一个boolean型的值,而==其比较的是双等号两边的值是否相等,对于基本数据类型的变量就直接比较两值是否相等即可;对于引用数据类型变量,比较的则为两变量的“值”。这里的用“值”是因为,引用数据类型的变量名所存储的是该对象的地址,而不是对象的内容。所以,使用==来比较引用数据类型的时候实质是比较地址值。
equals():这个会有些不同,对于继承Object类的子类和一些重写了该方法的之类会
equals和==初探.pdf
(346.13 KB, 下载次数: 18)
用不一样的结果(比如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
|