"=="对比的是栈中的内容。基本数据类型比较的是变量值;引用类型比较的堆中内存对象的地址。
equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。
注:对于"=="中引用类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。
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]) //实质比较字符的ascii值,即两个字符串内容的比较!
return false;
i++;
}
return true;
}
}
return false;
}
应用案例分析:
String str1 = "Hello"; // 分配到常量池
String str2 = new String("Hello"); // 在堆中分配内存
String str3 = str2; // 引用传递
System.out.println(str1 == str2); // false,比较两者栈中的内存地址,显然不同
System.out.println(str1 == str3); // false
System.out.println(str2 == str3); // true
System.out.println(str1.equals(str2)); // true,string重写了equals方法,实际上对比的两个字符串的内容
System.out.println(str1.equals(str3)); // true
System.out.println(str2.equals(str3)); // true
注意:以后进行字符串相等判断的时候使用equals(),即对比字符串的内容。