Java中默认的 equals方法实现如下:
public boolean equals(Object obj){
return(this==obj);//如果两个引用指向同一个对象,则返回true,否则返回false
}
但是String类覆盖了这个方法(注意看注释):
public boolean equals(Object anObject) {
if (this == anObject) {
return true;//如果指向同一个对象,则返回true
}
if (anObject instanceof String) { //如果是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++]) //判断 两个String对象中的 char value[]属性 是否完全相同,不同则返回false
return false;
}
return true;//如果两个String对象的count属性与value[]属性完全匹配相等,则返回true
}
}
return false;//必须是String类的对象
}
“==”:
运算符“==”用来比较两者地址是否相等。这两个对象既可以为基本类型(一个数字,一个字符或一个布尔值。),也可以的引用类型(它的值是指向内存空间的引用,就是地址)。
当他们都是引用类型的时候,必须都引用同一个对象(即地址相同)才返回 true
String s1="hello";
String s2="hello";
System.out.println(s1=s2);
此时为true,String 为引用类型。因为常量池的存在,所以s1与s2指向为”hello“的同一个块内存单元。
Person p1=new Person("Tom",18);
Person p2=new Person("Tom",18);
System.out.println(p1=p2);
此时为false,Person为引用类型。但是因为使用了new关键字 另外开辟了一块内存,所以p1与p2指向的是两块不同的内存。
equals():
我们讨论 equals()方法分为两个部分:
一、String类的equals()方法
由于String类重写了equal(),其就是用来比较两个String对象的内容是否相等。
基本类型的包装类(Integer,Long等)其实都已重写了equald()方法。
二、其他类的equals()方法
Java 语言里的 equals方法其实是交给开发者去覆写的,让开发者自己去定义满足什么条件的两个Object是equal的。
equals()的行为对于每个对象来说与“==”是对等的,但是equals()可以又开发者由于自己的业务规则去重写。
“==”一般用于基本类型的比较,而equals()常用于类对象的比较。