equals方法和双等号解析
1.在Java的源代码中,java.lang.Object类中有一个equals方法;这个方法特别简单,但是会经常使用到,并且面试的时候也会经常出现。
2.下面是java源码中Object的equals方法的实现,其实现非常简单:
public boolean equals(Object obj) { return (this == obj); }
3.由于equals()方法定义在Object类中,因此Java中的每个类都具有该方法。
4.对于Object类的equals方法来说,它是判断调用equals方法的引用与传进来的引用是否一致,即这两个引用是否指向的是同一个对象。
5. Object obj1 = new Object();
Object obj2 = new Object(); System.out.println(obj1.equals(obj1)); //true System.out.println(obj1.equals(obj2)); //false上面的两个输出验证了上面的说法,同一个对象使用equals方法进行比较返回true,不同两个对象使用equals进行比较返回false。6. String s1 = new String("aa");
String s2 = new String("aa"); System.out.println(s1.equals(s2));针对String两个不同对象使用equals进行比较,此刻我们将产生迷惑,竟然返回true,这有驳斥与上面的说法,这是为什么呢?
7.面对String的equals方法,我们需要仔细思考一些问题:Java中所有的类都继承自Object,String也不例外,但是它的equals方法显然没有按照Object类的方法执行,难道String重写了父类Object类的equals方法?
8.带着上面的疑问,我们可以查看写String的源码,看看equals方法怎么实现的就好了。编程学习中,解决疑惑的最好方法就是查看源码,源码能真实的告诉你真相。
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false;}
9.由上面的源码可以看出,String类重写了父类Object的equals方法。对于String类的equals方法来书,它是判断调用这个方法的字符串与传进来的字符串的内容是否一致。长度和内容都一样。
10.总结来说,在使用equals方法时,如果使用的类没有重写父类Object的equals方法,则比较两个对象的引用是否指向同一个对象,即等价于双等号;如果使用的类重写了父类Object的equals方法,比如String类,此刻equals方法比较的是什么就要看重写的内容了,String的equals比较的是两个字符串的内容是否一致。
11.由上面的结论我们可以得出,在判断String相等性时,一定要使用equals方法,而不是使用==,equals方法第一步就进行了==的判断,只有使用equals方法才能判断两个字符串是否内容一致。
12.不能笼统的说,==是判断两个引用是否一致,而equals方法是判断内容是否一致,这种说法是不准确的。==是判断两个引用是否一致这个没错,但equals方法使用在没有重写Object的方法时,是判断两个引用地址是否一致,而重写了的时候就不一定是了,String就是判断内容是否一致。我们在写自己的类时都可以重写equals方法,来实现内容一致。