黑马程序员技术交流社区

标题: 集合去除重复元素疑问 [打印本页]

作者: Gump    时间: 2013-12-20 10:45
标题: 集合去除重复元素疑问
本帖最后由 Gump 于 2013-12-20 13:07 编辑
  1. public boolean equals(Object obj)
  2.         {
  3.                 if (!(obj instanceof Person))
  4.                         return false;
  5.                 Person p = (Person)obj;
  6.                 System.out.println(this.name+"---"+p.name);
  7.                 return this.name.equals(p.name) && this.age==p.age;
  8.         }
复制代码

疑问1:public boolean equals(Object obj)Person本身不就已经继承了Object了嘛,为啥这里还要覆盖一下呢?
疑问2;instanceof 的使用方法,它主要就是用来比较俩个类相同吗?
疑问3:Person p = (Person)obj; 这个向下转型,的目的是什么啊?
疑问4:return this.name.equals(p.name) && this.age==p.age;这里的this.name 与p.name,难道不都是Person.name?这里该怎么理解呢?

希望得到大神们的,详细解答


作者: 谢文斌    时间: 2013-12-20 11:10
本帖最后由 谢文斌 于 2013-12-20 11:19 编辑

回答1:继承了,就是用父类的方法比较,但是父类的比较方法不是你想要的,或者对象没有可比性,你让人家怎么比?所以你要覆盖,用自己的方法比;
回答2:这是一个多态用法,当父类引用指向子类对象时,用“父类引用 intanceof 子类”为真,是is a的关系。
回答3:这个涉及到多态的特点,你记一下:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,便用通过;如果没有,编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
总结:成员函数在多态调用时,编译看左边,运行看右边。

在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)
在多态中,静态成员函数的特点:
无论编译和运行,都参考左边所以,如果你不转型,当使用了子类特有的方法或变量时,你会编译失败的

回答4:比如:集合里已经有一个Person,你再往里add 一个Person,那么这两个Person就会按照你写的方法比较一下。
this应该就是你添加的当前Person,obj应该是在集合中那一个Person.
如果集合里有多个,则this与它们逐一比较。


作者: 小骗子    时间: 2013-12-20 11:16
整个方法是重写了Person类的equal方法。
首先通过 (!(obj instanceof Person) 判断传参obj是否是Person的实例对象。
然后Person中有2个属性,name和age,通过判断name、age是否都相同,判断它们是否是相等的。

1.不是覆盖,因为在比较时候,即this.equals(obj)时,你不知道obj是什么类型,所以才有了
(!(obj instanceof Person) 判断是否是Person类型。
4. this指实例化的对象
作者: 一年之后    时间: 2013-12-20 11:50
第一个问题:原有的equals比较的是字符串,而现在你传入的是对象,所以得重写equals建立自己的比较方式。
第二问题:不是判断两个类是否相同,是判断这个obj是否是Person的实例化对象,如果是就返回true,如果不是就返回false
第三个问题:是多态的原理,Object obj = new Person(); obj父类的对象,不可能调用子类的属性,所以向下转型是为了调用子类的属性,
第四个问题:当你向集合中传入第一个对象的时候,他不会调用equals方法,因为就一个对象,没有比较的。传入第二个对象的时候,这个对象就是本类对象this,而你要比较的是以前传入的对象,就用p调用。
如果你都用p调用的话,那么return返回的必然是true。而你的只剩第一个元素,因为第一个元素不调用
equals方法。

作者: Gump    时间: 2013-12-20 13:04
谢文斌 发表于 2013-12-20 11:10
回答1:继承了,就是用父类的方法比较,但是父类的比较方法不是你想要的,或者对象没有可比性,你让人家怎 ...

感谢,说的很清楚
作者: Gump    时间: 2013-12-20 13:05
小骗子 发表于 2013-12-20 11:16
整个方法是重写了Person类的equal方法。
首先通过 (!(obj instanceof Person) 判断传参obj是否是Person的实 ...

感谢     
作者: Gump    时间: 2013-12-20 13:07
一年之后 发表于 2013-12-20 11:50
第一个问题:原有的equals比较的是字符串,而现在你传入的是对象,所以得重写equals建立自己的比较方式。
...

感谢,讲的很清楚
作者: Gump    时间: 2013-12-20 13:31
一年之后 发表于 2013-12-20 11:50
第一个问题:原有的equals比较的是字符串,而现在你传入的是对象,所以得重写equals建立自己的比较方式。
...

那最后是怎么把重复的数据去掉的啊?
作者: Gump    时间: 2013-12-20 13:43
谢文斌 发表于 2013-12-20 11:10
回答1:继承了,就是用父类的方法比较,但是父类的比较方法不是你想要的,或者对象没有可比性,你让人家怎 ...

你好,我还想问一下,他们是怎么实现去除重复数据的呢?
return this.name.equals(p.name) && this.age==p.age;
只是做个比较吧?返回一个比较的结果而已,是通过下面的临时 容器去除的么?
作者: 谢文斌    时间: 2013-12-20 13:47
Gump 发表于 2013-12-20 13:43
你好,我还想问一下,他们是怎么实现去除重复数据的呢?
return this.name.equals(p.name) && this.age== ...

判断name且age是否相等
返回真,说明是同一个人。
集合就是根据这个返回的boolean值判断两个对象是否相同的。

所以,你什么都不写,就直接return false;
那就算name和age一样,也能存进集合里,这么说明白么?
作者: Gump    时间: 2013-12-20 14:07
谢文斌 发表于 2013-12-20 13:47
判断name且age是否相等
返回真,说明是同一个人。
集合就是根据这个返回的boolean值判断两个对象是否相同 ...

理解了,谢谢了哈,前面看过的有点忘了,得复习复习了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2