黑马程序员技术交流社区

标题: 关于框架集合问题,equals() 方法【已解决】 [打印本页]

作者: 马林贺    时间: 2012-6-5 17:22
标题: 关于框架集合问题,equals() 方法【已解决】
本帖最后由 马林贺 于 2012-6-5 23:48 编辑

  1. import java.util.ArrayList;
  2. import java.util.Iterator;

  3. //创建对象类
  4. class Prerson {
  5. private String name;
  6. private int age;

  7. // 构造函数
  8. Prerson(String name, int age) {
  9.   this.name = name;
  10.   this.age = age;
  11. }

  12. // 覆写Object类中的equals方法
  13. public boolean equals(Object obj) {
  14.   if (!(obj instanceof Prerson)) {
  15.    return false;
  16.   }
  17.   Prerson pobj = (Prerson) obj;
  18.   return this.name.equals(pobj.name) && this.age == pobj.age;
  19. }

  20. // 获取姓名的方法
  21. public String getName() {
  22.   return name;
  23. }

  24. // 获取年龄的方法
  25. public int getAge() {
  26.   return age;
  27. }
  28. }

  29. class ArrayListTest {
  30. // 去重复方法
  31. public static ArrayList removeRepeat(ArrayList arr) {
  32.   ArrayList list = new ArrayList();

  33.   Iterator it = arr.iterator();
  34.   while (it.hasNext()) {
  35.    Object obj = it.next();
  36.    if (!list.contains(obj)) {
  37.     list.add(obj);
  38.    }
  39.   }

  40.   return list;
  41. }

  42. public static void main(String[] args) {

  43.   ArrayList arr = new ArrayList();
  44.   arr.add(new Prerson("小李01", 40));
  45.   arr.add(new Prerson("小李02", 42));
  46.   arr.add(new Prerson("小李03", 42));
  47.   arr.add(new Prerson("小李04", 40));
  48.   Iterator it = arr.iterator();
  49.   while (it.hasNext()) {
  50. <STRONG>  /* if (it.next() instanceof Prerson) */</STRONG>{
  51.     Prerson p = (Prerson) it.next();
  52.     System.out.println(p.getName() + "......" + p.getAge());
  53.    }

  54.   }
  55.   System.out
  56.     .println("--------------------------华丽分割线---------------------------");
  57.   ArrayList list = removeRepeat(arr);
  58.   Iterator iter = list.iterator();
  59.   while (iter.hasNext()) {

  60. <STRONG>   if (iter.next() instanceof Prerson)</STRONG> {
  61.     Prerson p = (Prerson) iter.next();
  62.     System.out.println(p.getName() + "......" + p.getAge());
  63.    }
  64.   }

  65. }

  66. }</P>
  67. <P style="LINE-HEIGHT: 30px; TEXT-INDENT: 2em"></P>
复制代码
1. 为什么我只是覆写了Object中的equals()怎么会自己调用,解释一下,看视频没有弄懂
   
    2. 我代码加粗的部分,加与不加怎么回事两个运行结果,求解释,不是去除重复的方法造成的
     if (iter.next() instanceof Prerson)

jieguo.jpg (22.91 KB, 下载次数: 68)

jieguo.jpg

作者: 马林贺    时间: 2012-6-5 17:47
   没有高人帮忙解释一下吗?
作者: 闾丘日月    时间: 2012-6-5 17:47
为什么会自己调用。
lz你想想看如果是你,你写一个集合的增删改查的方法时,你不用一个个对象的去比较么??
增加的时候,你是不是会看看元素是不是相等啊,删除的时候,你会看看要删除哪个,在一个没有角标也就是没有一种对应关系的表的情况,你不要去一个个元素的比较么?
相等就认为找到了,然后给你删了,查找也一样,需要一个个的去比较的。
所以你只要调用了集合中的方法,这个几乎必然会调用equals方法的。我说几乎必然,是说可能有些方法不需要比如获得集合大小之类的。
作者: ljh11849    时间: 2012-6-5 17:48
你new出来的"李01"那几个对象本身就是person类型,<STRONG>  /* if (it.next() instanceof Prerson) */</STRONG>你这句话加与不加有什么区别?
作者: 马林贺    时间: 2012-6-5 17:50
ljh11849 发表于 2012-6-5 17:48
你new出来的"李01"那几个对象本身就是person类型,  /* if (it.next() instanceof Prerson) */你这句话加与 ...

  假如我里面有别的对象呢?
作者: 马林贺    时间: 2012-6-5 17:52
闾丘日月 发表于 2012-6-5 17:47
为什么会自己调用。
lz你想想看如果是你,你写一个集合的增删改查的方法时,你不用一个个对象的去比较么? ...

你的意思是,只要是设计到类里面的 增删改查,都要用到equals方法吗?
作者: ljh11849    时间: 2012-6-5 17:54
这有关系吗?增删改查怎么会用到equals方法{:soso_e141:}
作者: 马林贺    时间: 2012-6-5 17:56
我也不懂,所以才发个帖子,问问大家。。。。
作者: 闾丘日月    时间: 2012-6-5 18:11
是你的话你该如何保证集合里面元素的唯一性?lz你要知道,集合里面的元素是唯一的
必须一个个的比较它们是否相等对不对?
比较相等是不是equals方法?
不是所有类都需要equals方法的,集合类特有的,你想想你如果要写一个唯一元素的整数数组的类,你是不是在往里添加元素的时候,需要用到for循环遍历整个数组?
然后比较他们是否相等?
集合类内部就这么干的。因为集合的特点是元素的唯一性,而唯一性是调用equals方法的原因。

作者: 马林贺    时间: 2012-6-5 19:38
闾丘日月 发表于 2012-6-5 18:11
是你的话你该如何保证集合里面元素的唯一性?lz你要知道,集合里面的元素是唯一的
必须一个个的比较它们是 ...

   那么关于第二 问题你知道,问什么会造成那个结果吗?

作者: 姚玉鹏    时间: 2012-6-5 19:39
第一个 那个equals 是person类中的 当你用“list.contains(obj)” contains会调用equals方法 。

第二个 加上if (iter.next() instanceof Prerson)这时迭代器指针向下走了一次。
    Prerson p = (Prerson) iter.next();这时迭代器的指针又向下走了一次  。
作者: 马林贺    时间: 2012-6-5 19:47
姚玉鹏 发表于 2012-6-5 19:39
第一个 那个equals 是person类中的 当你用“list.contains(obj)” contains会调用equals方法 。

第二个 加 ...

    那如何在哪里加上判断类型的条件呢?  只能通过  Object 接收一下  在进行判断吗?
作者: 闾丘日月    时间: 2012-6-5 19:59
马林贺 发表于 2012-6-5 19:38
那么关于第二 问题你知道,问什么会造成那个结果吗?

第二个问题,我不是很清楚你想要表达的意思
我给你指出你注释打开会出现什么问题吧
  while (it.hasNext()) {
<STRONG>  /* if (it.next() instanceof Prerson) */</STRONG>{
    Prerson p = (Prerson) it.next();
    System.out.println(p.getName() + "......" + p.getAge());
   }
你里面用 了两次it.next();每一次调用it.next都会指针向下移动一位,类似于i++
也就是说你如果打开那个注释期望有4次循环是不现实的,如果打开注释的结果是第二个和第四个啦
想要加if判断的话最好用Object obj先将it.next()存起来,在一次循环保证只调用一次it.nex()能够避免一些奇奇怪怪的问题




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