区别
== :对于基本数据类型而言,"= =" 是比较数据值是否相等;对于引用数据类型而言, ==比较对象地址是否相等。结果为boolean类型,相同为true,不同为false。
equals:Object类中比较地址是否相同,而String类中重写了equals方法,从而比较两个字符串内容是否相同。
代码展示分析
==代码部分
public class Test {
public static void main(String[] args) {
double a = 10.0;
int b = 10;
System.out.println(a==b);
String str1 = "Jim";
String str2 = "Tim";
System.out.println(str1==str2);
}
}
代码结果为:
true
false
在第一类比较中,a与b的值相同,因此输出true;
在第二类比较中,str1与str2的内容存储在常量池中,而由于内容不同,因此在栈中储存的地址不同,在比较时由于地址不同,因此输出false。
equals代码部分
public class Test {
String name;
public static void main(String[] args) {
String name1="Tim";
String name2="Tim";
System.out.println(name1.equals(name2));
Test test = new Test();
test.name ="Tim";
System.out.println("1+"+name1.equals(test));
System.out.println("2+"+name1.equals(test.name));
String name3=new String ("Tom");
System.out.println(name1.equals(name3));
}
}
代码结果为:
true
1+false
2+true
false
在第一类比较中,name1与name2 的内容相同,因此数据存储在常量池中的同一地址空间,所对应的地址相同。输出true。
在第二类中,为帮助更好理解String中被重写的equals方法,在main函数外定义一个name方法,并定义一个test对象,使其调用name方法为"Jim"。通过两次比较可以看出:test对象与name1的地址不同,内容不同而输出1+false,但是调用name方法为其赋值为"Jim",因此可以看到,虽然两者的地址不同,但由于字符串中的内容完全相同而输出2+true。
在第三类中,可以看出,由于name1与name3两者的地址不同,内容也不同,因此进行判定后输出的结果为false。
对于上述情况及判断方法,不妨将重写的String的equals摘出分析其运行判断原理,以最后一组判别为例。
public boolean equals(Object anObject) {//anObject储存上转型对象地址
if (this == anObject) {//比较地址是否相等,地址相等则储存数据相同,输出true
return true;
}
if (anObject instanceof String) {//判断anObject变量所指向的地址是否为String类型
String anotherString = (String)anObject;//多态的体现,将上转型对象转化为下转型对象;
int n = value.length;//给n赋值value的长度(value为name1的数组)
if (n == anotherString.value.length) {//判断value与anotherString.value(name2的数组)的长度是否相等
char v1[] = value;//name1的数组
char v2[] = anotherString.value;//name3的数组
int i = 0;//逐位判断name1和name3的字符是否相等
while (n-- != 0) {
if (v1[i] != v2[i])//不同即输出false,结束判断
return false;
i++;
}
return true;
}
}
return false;
}*/
该代码块由两部分构成,第一个if语句判断两个字符串的地址是否相同,若相同,输出true,结束判定;若不同进入第二个if语句进行判断两个对象是否指向String类型,若不指向String类型,则输出false。若指向String类型,则继续进行如下操作:由于需要使用子类String中的 .length()方法,所以需要对anotherObject进行下转型操作,从而实现对比两字符串长度是否相同,若不想同,则输出false;若相同,则将两字符串分别转化为数组形式,并分别赋值给字符型数组v1[],v2[],从而进入while循环逐位进行判断对应字符是否相同,若出现字符不同,则输出false;若未出现字符不同,这说明字符分别对应相等,输出true,判断结束。