更新时间:2020-08-26 15:25:27 来源:极悦 浏览1740次
equals源码分析
/**
* @param obj the reference object with which to compare.
* @return {@code true} if this object is the same as the obj
* argument; {@code false} otherwise.
* @see #hashCode()
* @see java.util.HashMap
*/
public boolean equals(Object obj) {
return (this == obj);
}
上面简单的三行代码就是Object类中equals的源码。主要的比较是两个对象的地址。可以看到,方法体中equals比较其实也是“==”实现的。因此,下次在面试的过程中,你遇见问equals与“==”的区别的时候,你先给出结论。==是比较两个对象地址的,没有重写equals方法的实体类使用equals也是比较地址的。
那么我们经常用String中equals为什么是比较值的呢?接下来我们看一下String类中equals的源码
String中equals方法源码分析
/**
*@param anObject
* The object to compare this {@code String} 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) {
//可以看到,String中重新的equals方法在第一步就进行了地址比较,
//如果两个字符串的地址相等,那么他们的值一定相等,就不用去进行下面的值比较了
if (this == anObject) {
return true;
}
//这个if表示,如果equals的方法体中不是一个String类型,那么也就直接返回为false
//比如“蜜蜂攻城狮
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;
}
在我们实际编写代码的时候,特别是一些需要重写equals方法的实体类的时候,那么我们需要进行equals的方法重写,重写equals方法需要遵守如下约定。翻译如下
(1)自反性:x.equals(x)必须返回true。
(2)对称性:x.equals(y)与y.equals(x)的返回值必须相等。
(3)传递性:x.equals(y)为true,y.equals(z)也为true,那么x.equals(z)必须为true。
(4)一致性:如果对象x和y在equals()中使用的信息都没有改变,那么x.equals(y)值始终不变。
(5)非null:x不是null,y为null,则x.equals(y)必须为false。
以上就是极悦java培训机构的小编针对“你应该学会的Java源码学习”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习