常见的String类实例化方式有两种
public class Strings {
public static void main(String[] args) {
String str = "abc";//第一种方式
String str2 = "abc";//第一种方式
System.out.println(str == str2);//输出true
String str3 = new String("abc");//第二种方式
System.out.println(str == str3);//输出false
str.equals(str3);//输出false
}
}
第一种方式是直接赋值的类型。先在常量池中给“abc”字符串分配空间,然后让str指向常量池中的“abc”。执行String str2 = “abc”;前先在常量池中检查有没有abc字符串,要是有就直接让str2指向该字符串。所以str跟str2指向一样。对于引用数据类型而言==比较的是地址。第二种方式创建的对象地址均不同,所以str3指向的地址不可能跟str一样。
再来分析equals(Object anObject)这个方法。该函数定义于Object。在没有重写前该方法就是"=="的作用。String类中把这个方法重写了:
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类里的相关源码。首先比较指向的地址是否一样,一样的话直接判定为true。不一样就接着判断。然后用instanceof运算符检查anObject这个对象是否是String类创建的,也就是检查传入的参数是否是字符串。当判断成立就把anObject对象下转。然后一个对每个字符的对比了。