== 与 equals 区别
-
== : 判断两个对象的地址是不是相等,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)
-
equals() : 判断两个对象是否相等,但它一般有两种使用情况:
- 类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象
- 类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)
public class test1 {
public static void main(String[] args) {
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b为另一个引用,对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // false,非同一对象
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("a.equals(b)");
if (42 == 42.0) { // true
System.out.println("true");
}
}
}
- 说明
- String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值
- 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象
equals 和 hashcode
- 两个都是 Object 类的方法,equals 是比较对象地址是否相对,hashcode 是获取对象的地址
- 为什么重写 equals 时必须重写 hashcode ?
- java 规定两个对象 equals 方法返回 true,hashCode 的值必须相等
- 重写 equals 方法返回 true,但是不重写 hashCode,返回 hashCode 不相等,这就违背规定
- 为什么要有这样的规定 ?
- equals 里的比较一般相对复杂,这样效率就比较低,而利用 hashCode 进行对比,则只要生成一个 hash 值进行比较就可以了,效率很高
- 有这样的规定之后,两个对象比较是否相等,可以先通过 hashcode 比较是否相等,如果不相等, equals 一定返回 false,那么就不用再通过 equals 进行比较
- hashcode 比较相等之后,为什么还要进行 equals 比较 ?
- equals 相等的两个对象,它们的 hashCode 肯定相等,也就是用 equals 对比是绝对可靠的
- hashCode 相等的两个对象,它们的 equals 不一定相等,也就是 hashCode 不是绝对可靠的
- 所有对于需要大量并且快速的对比的话如果都用 equals 去做显然效率太低,解决方式是,每当需要对比的时候, hashCode 去对比,这就用到了哈希表,能够快速的地位到对象的存储位置,如果hashCode不一样,则表示这两个对象肯定不相等(也就是不必再用equals去再对比了),如果hashCode相同,此时再对比它们的 equals,如果equals也相同,则表示这两个对象是真的相同了。