判断是否相等,当判断基本数据类型的时候和==一样,当判断引用类型的值的时候,==和Equals都是比较栈内存中的地址是否相等。
1、string是一个特殊的引用类型。对于两个字符串的比较,不管是 == 和 Equals 这两者比较的都是字符串是否相同;
2、当你创建两个string对象时,内存中的地址是不相同的,你可以赋相同的值。
所以字符串的内容相同。引用地址不一定相同,(相同内容的对象地址不一定相同),但反过来却是肯定的;
3、基本数据类型比较(string 除外) == 和 Equals 两者都是比较值;
看一下 String中重写Object的equals源码
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
object类的equals()方法,判断调用该方法的对象与要比较的对象是不是同一个对象(判断地址),而String类中的equals()方法,则判断当前字符串与传递进来的字符串的内容是否一致。
针对楼上说的第二问,你忽略的常量池技术:
以下两种创建String对象方式
String a="1";
String b="1";
System.out.println(a==b);结果true,a和b指向常量池中同一个内存空间
String a1=new String("2");
String b1=new String("2");
System.out.println(a1==b1);结果false,a1和b1分别位于堆中不同的内存空间