概述
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方法,来实现内容一致。
转载于:https://blog.51cto.com/zlfwmm/1692544
最后
以上就是疯狂钥匙为你收集整理的Java记录 -23- equals方法和双等号解析的全部内容,希望文章能够帮你解决Java记录 -23- equals方法和双等号解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复