总结:
类型不同 对象不同 运行速度不同
一:类型不同
equals():是Object中声明的方法;
==:是比较元素符。
二:比较对象不同
equals():在Object底层仍是使用来判断传入对象是否相同;如果没有对equals进行重写,equals和实现的效果是相同的。
如果该对象没有重写equals方法,则比较的是地址值,如果重写了,就按重写的规则来比较两个对象,会比较类中的相应属性是否都相等;重写过后不是比较两个对象的内存地址值是否相同,而是比较两个对象的“内容值”是否相同。
//object中定义的equal方法
public boolean equals(Object obj) {
return (this == obj);
}
//可见,底层仍然是使用 == 来判断,当前内容和传入对象是否相同
在不同的类中重写的equals方法不同,所以要理解本质,并不是所有的equals方法都是比较地址的。重写过后不是比较两个对象的内存地址值是否相同,而是比较两个对象的“内容值”是否相同。
//String类中重写的equals方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
//instanceof :是多态中的关键字,用来判断anObject 是否是 String数据类型。
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;
}
equals 和 == 的区别:
equals:
String str = "小红";
String st2 = "小红";
//这里比较的是字符串的值,可以对照String类中重写的equals方法
boolean equals1 = str.equals(st2);
System.out.println(equals1); //true
String str2[] = {"1","2","3","4"};
String str3[] = {"1","2","3","4"};
//这里比较的是str2 和 str3的地址值,即使他们存入的内容是相同的,但是实际比较的是他们存储在内存中的地址值
boolean bl = str2 == str3;
System.out.println(bl); //false
//比较的就是地址值是否相同
boolean equals = str.equals(str3);
System.out.println(equals);//false
==:
针对基本数据类型:比较的就是值;
针对引用数据类型:比较的就是内存地址;
String str = "小红";
String str2[] = {"1","2","3","4"};
String str3[] = {"1","2","3","4"};
//这里比较的是str2 和 str3的地址值,即使他们存入的内容是相同的,但是实际比较的是他们存储在内存中的地址值
boolean bl = str2 == str3;
System.out.println(bl); //false
//这里是把获取到的str2[1]的值,和str字符串进行比较;
//所以这里比较的是在常量池中的字符串和在堆内存中存储的str2的值进行比较
boolean bl1 = str == str2[1];
System.out.println(bl1); //false
//这里比较的是基本数据类型的值,只要定义的值相同,都会返回TRUE。
int num = 5;
double num2 = 5;
boolean bl2 = num == num2;
System.out.println(bl2); //true
三:运行速度不同
equals():没有==运行速度快。