通常我们遇到"=="与"equals"的问题时,我们都说"=="用于比较内存地址是否相等,"equals"用于比较对象的值是否相等,
虽然通常是这样,这样记也便于我们理解,但个人觉得这样的一个说法反而造成了我们对这个问题的理解出现了局限性,
有很多学生就这样认为"=="就是比较地址,equals就是比较对象的值的,导致遇到与这个说法不一致的问题时,反而更迷惑了。
所以我们会遇到这样的问题:
<1> 在使用 "==" 时:
public static void main(String[] args) {
User user1=new User("yuyihua", 20);
User user2=user1;
boolean result1 = (user1==user2);
boolean result2 = (new User("yuyihua", 20))==(new User("yuyihua",20));
System.out.println("result1=" + result1);
System.out.println("result2=" + result2);
}
result1=true
result2=false
为什么两个结果不一样呢?
<2>在使用 "equals" 时:
public static void main(String[] args) {
boolean result1 = (new String("yuyihua")).equals(new String("yuyihua"));
boolean result2 = (new User("yuyihua",20)).equals(new User("yuyihua",20));
System.out.println("result1=" + result1);
System.out.println("result2=" + result2);
}
result1=true
result2=false
为什么两个结果不一样呢 ?
"=="用于比较两个值的内存地址在这里我们可以说的过去
在<1>中
(new User("yuyihua", 20))==(new User("yuyihua",20))时创建了两个实例对象,它们指向不同的空间
(new 一个对象时分配空间)
User user2=user1 说明user2引用对象指向user1的引用对象指向的值,所以它们指向的是同一个地址
(这里user2没有new)
"equals"用于比较两个对象的值在这里就有点说不过去了
在<2>中
(new String("yuyihua")).equals(new String("yuyihua"))
(new User("yuyihua",20)).equals(new User("yuyihua",20))
看似一样怎么结果不一样呢,我的理解是
(new String("yuyihua")).equals(new String("yuyihua"))
创建的是String类的对象,所以我们调用时是调用String类中的equals方法
(String类中覆盖了Object基类的equals方法)
方法体为比较两个对象中的值是否相等,所以结果相等。
(new User("yuyihua",20)).equals(new User("yuyihua",20))
中创建的是User类的对象,所以我们调用的是Object中的equals方法
(User类中没有覆盖Object基类的equals方法)
方法体为类似比较两个对象的地址,所以结果不相等。
所以我觉得是"=="比较内存地址,equals比较什么取决于调用此方法的对象中的equals方法,如没有覆盖Object中的方法,则调用Object
中的equals方法,比较内存。
由于我们用到equals时大多是比较两个字符串,所以大多数时候equals比较的是对象的值。
<这是我的第一篇文章,可能有的地方说的不是很正确,有错误的地方还希望大家提出来,我只是写出自己的看法>