==
- 当比较的是基本数据类型时,判断的是值是否相等
- 当比较的是引用类型数据时,判断的存放的内存地址是否相等
public class equalsString {
public static void main(String args[]){
int a = 1 ;
int b = 1 ;
System.out.println(a==b);// true
String str2 = new String("中国" ) ;
String str3 = new String("中国") ;
System.out.println(str2 == str3); //false
}
}
- 在上述代码中,a和b为基本数据类型,且都被赋值为1,所以两者值相等,为true
- 而str2 和st3中虽然内容都为"中国",但是存放的地址不同,所以为false ;
equals
equals 是Object类的通用方法,默认情况下,equals和==比较是一样,比较的是他们在内存中存放的地址 ;但是,通常情况写equals方法会被重写,具体区别如下:
- 没有被重写的情况下,默认是Object类,以下是equals方法在Object类中的方法源码:
public boolean equals(Object obj) {
return (this == obj);
}
- equals方法被重写的情况,以String 类为例,以下是String类中的equals方法:
@Override public boolean equals(Object other) {
if (other == this) {
return true;
}
if (other instanceof String) {
String s = (String)other;
int count = this.count;
if (s.count != count) {
return false;
}
if (hashCode() != s.hashCode()) {
return false;
}
char[] value1 = value;
int offset1 = offset;
char[] value2 = s.value;
int offset2 = s.offset;
for (int end = offset1 + count; offset1 < end; ) {
if (value1[offset1] != value2[offset2]) {
return false;
}
offset1++;
offset2++;
}
return true;
} else {
return false;
}
}
从源码我们可以看出,首先会使用== 比较存放的内存地址是否相等,当不相等时会比较内容是否相等。例如
public class equalsString {
public static void main(String args[]){
String str2 = new String("中国" ) ;
String str3 = new String("中国") ;
System.out.println(str2 == str3); //false
System.out.println(str2.equals(str3));// true
}
}