"=="的作用是比较两个变量是否相等。
- 当变量是基本数据类型时,比较的是值是否相等的:相等返回true,不等返回false:
double a = 100.0;
int b = 100;
System.out.println(a==b);
//输出结果为:
true
- 当变量是引用类型时,比较的是地址:地址一样返回true,地址不同则返回false:
String str1 = "apple";
String str2 = "apple";
System.out.println(str1==str2);
//输出结果为:
true
String str3 = new String("lemo");
String str4 = new String("lemo");
System.out.println(str3==str4);
//输出结果为:
false
"equals()"既可以用于判断 Number 对象与方法的参数进是否相等,也可以用于字符串与指定的对象比较。
- 当变量是Number时(且不为null),参数类型和数值都相等时返回true,否则返回false(Double 和 Float 对象还有一些额外的条件):
Integer x = 10;
Integer y = 5;
Integer z = 10;
Short m = 10;
System.out.println(x.equals(y));
System.out.println(x.equals(z));
System.out.println(x.equals(m));
//输出结果为:
false
true
false
- 当变量为String类时:先比较地址,再比较每个字符,当地址相同时即刻返回true,不用再比较每个字符;当地址不同时,再比较对应字符,相同时也返回true,不同则返回false:
String name1="Tim";
String name2="Tim";
System.out.println(name1.equals(name2));
Test test = new Test();
System.out.println(name1.equals(test));
String name3=new String ("Tom");
System.out.println(name1.equals(name3));
//输出的结果为:
true
false
false
让我们结合equals的源代码来了解一下其中的原理:
public boolean equals(Object anObject) {
if (this == anObject) { //此处比较两个变量的地址,this指代调用的是equals()方法对象的地址(此处即为name1的地址),
return true; //anObject存的是上转型对象的地址(即name2的地址),
} //因为name1和name2的地址一样,所以返回true
if (anObject instanceof String) { //此处判anObject变量所指向的对象是否为String类型,因为test不是String类,所以直接执行最后一行代码,即返回false
String anotherString = (String)anObject;//此处将上转型对象直接下转型(上转型对象不能直接调用子类新增的方法,因为Object类中没有下面要用的value.length方法,所以要下转型)
int n = value.length; //计算出调用equals()方法的String对象的每个字符组成的char类型数组的长度(即name1的长度)
if (n == anotherString.value.length) { //比较两个对象的char类型数组的长度
char v1[] = value; //name1的char类型数组
char v2[] = anotherString.value; //anObject所对应的字符串的字符构成的char类型数组(即name3的char类型数组)
int i = 0;
while (n-- != 0) { //对每个字符进行比较
if (v1[i] != v2[i]) //若有对应字符不相同,则返回false
return false;
i++;
}
return true;
}
}
return false;
}
来总结一下,
- 当变量是数字时,==仅比较数值,相同就true不同就false,但equals()除了比较数值以外,还要比较类型,两者都想同时返回true,否则返回false;
- 当变量是字符串时, ==仅比较地址,地址相同返回true,不同返回false,(不管对应字符是否一样),而equals()方法先比较地址再比较每个字符,只有每个对应字符不同时 ,才返回false,其他都返回true。