Java基础【之】==和equals 的区别,经典问题。
1.储备知识
- 所有类都继承了Object。可以重写 hashCode方法、equals方法、toString方法。
- equals:内部默认实现代码为
return (this == obj);
- == 比较基本数据类型:比较值。
- == 比较引用数据类型:比较对象的引用地址。
2.歧义的原因(重写)
产生理解歧义原因: 一些类内部重写了 equals方法
比如:String、File、Date ,内部实现各不相同。
String类用的地方太多了,形成了equals是比较值的错误观点。比如:8种基本数据类型的包装类中的 equals,是比较类型及内容而不考虑引用的是否是同一个对象;
- String.class 中的 equals
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[i] != v2[i]) return false; i++; } return true; } } return false; }
- File.class 中的 equals 方法
public boolean equals(Object obj) { if ((obj != null) && (obj instanceof File)) { return compareTo((File)obj) == 0; } return false; }
- Date.class 中的 equals 方法
public boolean equals(Object obj) { return obj instanceof Date && getTime() == ((Date) obj).getTime(); }
3.总结
- 1.如果:没有重写 equlas的话
equals
内部的实现就是return (this == obj);
- 情况1:== 比较基本数据类型:比较值。
- 情况2:== 比较引用数据类型:比较对象的引用地址。
- 2.如果:重写equals方法就要看,类的具体实现要求了。
《目录:Java渐进式学习》
《幕》
- 留白—《老吉》。
- ~ 今 ~ ❀ ~ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀