java 学习记录——equals和“==”
1.object类中的equals() 和 == 一样
这是object中关于equals()方法的源码
public boolean equals(Object obj) {
return (this == obj);
}
equals()和" == " 一样,比较变量值相不相等,但是equals()只用在比较对象, “==”比较对象和基本类型。
比较基本类型 例如 int, float,char,long,double ,就是直接比较值一不一样。
比较引用类型,其实也是比较值一不一样,只不过引用变量的值比较特殊,这个值我们知道就是指向对应对象的内存地址。简言之,就是比较两个引用类型是不是指向同一块堆内存地址。
2.在String类中,equals()方法被重写过
先看Stringl类中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()是真的在比较两个引用变量指向的字符串对象,它们之间是不是每个字符都一样。实际上,很多时候都需要重写equals(),毕竟我们不是只想比较两个引用类型变量是不是指向同一块儿地址。
3. 字符串的另一种创建方式
我们知道String的创建方式有很多,例如下面两种,涉及到常量池
String str1 = new String("str");
String str2 = new String("str");
System.out.println(str1.equals(str2)); //true 因为String类中重写了equals()方法,会真的比较字符串中的内容
System.out.println((str1==str2));//false 因为引用变量 str1 和str2 指向的堆中内存地址不一样
//第二种方法
String str11 = "strrrrrrrrrrrr";
String str22 = "strrrrrrrrrrrr";
//当执行String str11 = “strrrrrrrrrrrr”;这条语句时,
// 会在堆中的字符常量池里找”strrrrrrrrrrrr”这个字符串
// 若没有找到,则将”strrrrrrrrrrrr”这个字符串放入字符串常量池中.
// 而在栈中开辟一块名为str11的空间存放”strrrrrrrrrrrr”这块空间的引用.
// 当执行String str22 = “strrrrrrrrrrrr”;这条语句时,
// 会在堆中的字符串常量池里找”strrrrrrrrrrrr”这个字符串,
// 很显然,可以找到,于是便把字符常量池里”strrrrrrrrrrrr”这个字符串的引用地址赋给s2,
// 因此str11与str22存放的都是堆中字符常量池中的同一个”strrrrrrrrrrrr”的引用
System.out.println(str11.equals(str22));//true
System.out.println((str11==str22));//true