“==”常用于原生类型的比较,例如boolean, int, float等。但是在比较对象时,就会比较两个对象的引用地址,如果两个对象的引用完全相同(指向同一个对象)时,“==”操作会返回true,反之返回false。
int a = 1;
int b = 1;
System.out.println(a == b); //true 原生类型比较
String s1 = “abc”;
String s2 = “abc”; //常量池的原因,b与a内存地址相同
System.out.println(s1 == s2); //true
String s3 = new String(“abc”);
System.out.println(s1 == s3); //false, 字符串引用指向不是同一个对象
euqals()方法定义在Object类里面,Object类是所有对象类的基类,equals()方法的作用是根据开发者对Object类中equals()方法的重写而定义的。
Java 中默认的Object类中的equals()方法实现如下:
public boolean equals(Object obj) {
return(this == obj);
}
而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 s1 = “abc”;
String s2 = new String(“abc”);
System.out.println(s1 == s2); //false, 字符串引用指向不是同一个对象
System.out.println(s1.equals(s2)); //true, 字符串内容都是“abc”
而另一种情况是没有重写Object类中的equals()方法,例如StringBuffer类。
例子展示:
StringBuffer sb1 = new StringBuffer(“abc”);
StringBuffer sb2 = sb1;
System.out.println(sb1.equals(sb2)); //true, 此处作用与“==”相同
StringBuffer sb3 = new StringBuffer(“abc”);
System.out.println(sb1.equals(sb3)); //false
上面例子的equals()方法与“==”操作符比较对象引用时的作用一样,字符串对象的引用相同时,返回true,否则返回false。又与String类里面的equals()重写的方法不同,不是直接比较两个字符串实体是否相等。