总结:
类型不同 对象不同 运行速度不同
一:类型不同
equals():是Object中声明的方法;
==:是比较元素符。
二:比较对象不同
equals():在Object底层仍是使用==来判断传入对象是否相同;如果没有对equals进行重写,equals和==实现的效果是相同的。
如果该对象没有重写equals方法,则比较的是地址值,如果重写了,就按重写的规则来比较两个对象,会比较类中的相应属性是否都相等;重写过后不是比较两个对象的内存地址值是否相同,而是比较两个对象的“内容值”是否相同。
//object中定义的equal方法publicbooleanequals(Objectobj) { return (this==obj); } //可见,底层仍然是使用 == 来判断,当前内容和传入对象是否相同
在不同的类中重写的equals方法不同,所以要理解本质,并不是所有的equals方法都是比较地址的。重写过后不是比较两个对象的内存地址值是否相同,而是比较两个对象的“内容值”是否相同。
//String类中重写的equals方法publicbooleanequals(ObjectanObject) { if (this==anObject) { returntrue; } //instanceof :是多态中的关键字,用来判断anObject 是否是 String数据类型。if (anObjectinstanceofString) { StringanotherString= (String)anObject; intn=value.length; if (n==anotherString.value.length) { charv1[] =value; charv2[] =anotherString.value; inti=0; while (n--!=0) { if (v1[i] !=v2[i]) returnfalse; i++; } returntrue; } } returnfalse; }
equals 和 == 的区别:
Stringstr="小红"; Stringst2="小红"; //这里比较的是字符串的值,可以对照String类中重写的equals方法booleanequals1=str.equals(st2); System.out.println(equals1); //trueStringstr2[] = {"1","2","3","4"}; Stringstr3[] = {"1","2","3","4"}; //这里比较的是str2 和 str3的地址值,即使他们存入的内容是相同的,但是实际比较的是他们存储在内存中的地址值booleanbl=str2==str3; System.out.println(bl); //false//比较的就是地址值是否相同booleanequals=str.equals(str3); System.out.println(equals);//false
==:
针对基本数据类型:比较的就是值;
针对引用数据类型:比较的就是内存地址;
Stringstr="小红"; Stringstr2[] = {"1","2","3","4"}; Stringstr3[] = {"1","2","3","4"}; //这里比较的是str2 和 str3的地址值,即使他们存入的内容是相同的,但是实际比较的是他们存储在内存中的地址值booleanbl=str2==str3; System.out.println(bl); //false//这里是把获取到的str2[1]的值,和str字符串进行比较;//所以这里比较的是在常量池中的字符串和在堆内存中存储的str2的值进行比较booleanbl1=str==str2[1]; System.out.println(bl1); //false//这里比较的是基本数据类型的值,只要定义的值相同,都会返回TRUE。intnum=5; doublenum2=5; booleanbl2=num==num2; System.out.println(bl2); //true
三:运行速度不同
equals():没有==运行速度快。