1.equals是方法, 而 == 是操作符
2.如果变量是基本数据类型,只能用==比较,因为它里边没有equals方法, == 比较的是值, 如果是引用类型,则比较的是两个对象是否指向同一块内存空间(也就是地址值是否相等)
3.equals 是 Object 类提供的方法,每个Java 类都继承自 Object 类,所以每个对象都具有equals这个方法,Object类中定义的equals方法默认情况下是和==是一样的,都是比较的是存放地址, 但通过重写equals方法可以让它不是比较引用而是比较数据内容
4.equals会用 == 比较两个类型在内存中的地址一不一样,如果一样,则直接返回true,如果不一样,则直接往下走,再判断是否为string类型,如果不是,则强转为string类型,再将字符串数组拆分为单个字符,一 一比较,有一个不相同,则返回false,否则返回true
equals分析:
equals 方法没有被重写。如果类没有重写该方法,那么默认使用的就是 Object 类的方法
public boolean equals(Object obj) {
return (this == obj);
}
从源码可以看出,里面使用的就是 == 比较,所以这种情况下比较的就是它们在内存中的存放地址。
equals 方法被重写。以 String 类为例,以下是 String 类中的 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;
}
从源码可以看出, String 类重写了 equals 方法,当使用 == 比较内存的存放地址不相等时,接下来会比较字符串的内容是否相等,所以 String 类中的 equals 方法会比较两者的字符串内容是否一样。
例子:
String a = "Mr.Li";
String b = new String("Mr.Li");
String c = b;
System.out.println("a == b:" + a == b); //false
System.out.println("b == c:" + b == c); //true
System.out.println("a == c:" + a == c); //false
System.out.println("a.equals(b):" + a.equals(b)); //true
System.out.println("b.equals(c):" + b.equals(c)); //true
打印:
a == b:false
b == c:true
a == c:false
a.equals(b):true
b.equals(c):true
a.equals(c):true
String b 通过 new 的方式已经开辟了新的堆内存,String a = "Mr.Li" 是存放在常量池里的,两者在 Java 内存里存放的位置是不同的,所以 a == b 为 false; 而 equals 方法当两者存放的内存地址不同时,会比较两者的值,两者的值都是 "Mr.Li" ,所以 a.equals(b) 为 true