相信一定还有很多菜鸟像我一样的对equals与== 的使用和机制含糊不清,只是知道用,而不知道其运行原理,今天对他们做一个总结
(1), ==用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同;当用于引用类型的时候,是比较对象是否相同。
当一个类没有重写equals方法时,调用的是Object类的equals方法,其实现是通过==来比较两个对象的地址。(String类对equals进行了重写)
在API中对equals的描述是:
1.对于任何引用类型, o.equals(o) == true成立.
2.如果 o.equals(o1) == true 成立,那么o1.equals(o)==true也一定要成立.
3.如果 o.equals(o1) == true 成立且 o.equals(o2) == true 成立,那么o1.equals(o2) == true 也成立.
4.如果第一次调用o.equals(o1) == true成立,在o和o1没有改变的情况下以后的任何次调用都成立.
5.o.equals(null) == true 任何时间都不成立.
(2) public static void main(String args[]){
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
String str4 = new String("abc");
}
当用== 比较str1与str2的时候,返回true,在比较str3与str4的时候返回的却是false,同样是String类型的对象为什么会有不同的结果呢,因为
String str1 = "abc"; 产生的字符串存在于字符串池中,当声明另一个String str2 = "abc";的时候 拿的是同一个"abc"对象,所以会返回true。
当用equals对str1,str2,str3,str4进行任意比较返回都为true,因为Java重写了String的equals方法,比较的是其值,而不是地址。
(3)综上所述我们会在大多数时候对equals产生不满,因为它无法帮我们比较两个对象是否相同,所以当我们需要的时候就该自己来重写equals方法了。