以前一直在使用==比较符合equals()方法去比较两个对象,在使用的时候也是有时候使用==比较符而有时候使用equals()方法.
在使用的时候没有去注意他们的区别,而是很随意的使用,当一种行不通时就去换另一种. 一次在使用test==""在条件判断中时没有达到想要的效果,
就换用了"".equals(test); 然后突然想到他们之间到底有什么区别.于是就做了一些实验想要弄清楚他们之间的区别与联系.
public class EqualsDemo
{
public static void main(String[]args){
String s1=new String("test");
String s2="test";
String s3="test";
if(s1==s2)System.out.println("s1==s2");
else System.out.println("s1!=s2");
if(s1.equals(s2))System.out.println("s1 equals s2!");
else System.out.println("s1 not equals s2!");
if(s2==s3)System.out.println("s2==s3");
else System.out.println("s2!=s3");
}
}
运行结果:
运行结果分析:
(1)==比较符是比较两个对象的地址
(2)对于equals()方法不同的类比较的内容不同.
equals()方法是在Object类中实现的一个方法,在Object类中equals方法是比较两个两个对象的地址.
public boolean equals(Object obj) {
return (this == obj);
}
而java中任何类都可以重写equals()方法来实现自己的比较方式,String类重写了equals()方法. String类的equals()方法不仅会比较两个对象的地址,还会比较他们的字符串的内容.
如果被比较的两个引用指向不同的地址,但是两个地址中的字符串的内容是相同的String的equals()方法仍然会返回true. 而==比较符只会比较地址,如果地址不同就返回false.
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof 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++])
return false;
}
return true;
}
}
return false;
}
(3)String test1=new String("test"); 和String test2="test";这两种字符串变量初始化方式是不同的.
String test1=new String("test");这种初始化方式是直接去堆中为String对象分配内存,
而采用String test2="test";这种方式初始化时,编译器会首先去常量池中寻找"test"字符串,如果常量池中有"test"变量,test2这个引用会直接指向常量池中的"test"字符串,
如果常量池中没有"test"这个字符串,会先向常量池中添加"test"这个字符串,然后将test2指向这个字符串. 在声明String test3="test";的时候是直接将test3指向常量池中的"test"变量,所以test2和test3具有相同的地址,而test1和test2地址不同.
总结:==比较符比较两个引用所指向的对象地址,equals()方法比较的内容要根据具体的类来判断,如果重写equals()方法除了判断两个引用是否指向同一个对象外,还会判断两个对象的内容.
后续:
如下代码在程序中想要用==判断test1和letter是否相等。结果在逻辑上出现错误,test1属于类的成员变量,而letter是局部变量,两个变量存储在不同的地方。test1和test2都是类的成员变量,两个变量的值相同时实际是存储在同一个地方的。
public class Test{
private String test1=null;
private String test2="A";
public void test(){
String letter="A";
if(test1==null)test1=letter;
if(test1==letter)System.out.println("test1==letter");
if(test1==test2)System.out.println("test1==test2");
}
public static void main(String[]args){
new Test().test();
}
}