先上代码:
String str1="abc";
String str2="abc";
String str3=new String("abc");
System.out.println(str1==str2);//结果是true
System.out.println(str1==str3);//结果是false
== 对于基本数据类型,比较的是值,对于引用数据类型比较的是地址。
以双引号引起来的字符就是一个字符串对象,但其存储在JVM方法区内存的字符串常量池中,具有不可变性。
str1存储的是常量池中“abc”的地址,str2存储的也是"abc"的地址。而str3是通过构造方法new出来的字符串对象,存储的是堆内存中的地址,str3的对象保存的是"abc"在常量池中的地址。
String str1="abc";
String str2="abc";
String str3=new String("abc");
System.out.println(str1.equals(str2)); //true
System.out.println(str1.equals(str3)); //true
equals()是Object基类就具有的方法:
public boolean equals(Object obj) {
return (this == obj);
}
由此可以看出没有重写的equals()和==是相同的作用。
但是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()是比较其“字面值”是否相同。
hashCode()方法与equals()方法只有在涉及类对应的散列表时才有关联性。如类的对象是HashMap、HashSet、HashTable等数据结构的成员时,在重写equals()的同时必须重写hashCode()。
只有在这种情况下,才会产生如果两个对象相同(equals),哈希值一定相同;两个对象哈希值相同,并不一定是相同的对象(也就是哈希碰撞现象)。
参考链接: