String
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
底层是被final修饰的字符数组,所以字符串生成后不能被修改。
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;
}
equals方法被重写,比较的是字符数组中的元素是否相同。
String s1 = new String("sd"); //打印s1,打印的是堆中对象的地址值
String s2 = "sdfdsf"; //打印s2,打印的是常量池中的地址值
如果常量池中有"sdfdsf",那么变量s会直接指向常量池中的字符串,不会再在常量池中开辟新的空间
String s1 = new String("哈哈");
String s2 ="哈哈";
s1.intern() == s2; //true
s1==s2 //false
new String("哈哈");
"哈哈"在方法区的常量池中开辟空间暴露地址值,"new String()"在堆中开辟空间暴露地址值,并指向"哈哈"的地址值。
所以s1和s1的地址值不相同,一个在堆中,一个在常量池中。
但最终都是指向常量池中"哈哈"的地址值。
== 和 equals
== 的作用:
基本类型:比较的就是值是否相同
引用类型:比较的就是地址值是否相同
equals 的作用:
引用类型:默认情况下,比较的是地址值。
public class Object {
....
public boolean equals(Object obj) {
return (this == obj);
}
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
....
}