A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangkerui 中级黑马   /  2014-4-13 11:53  /  1089 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wangkerui 于 2014-4-13 18:24 编辑
  1. 例:将自定义对象作为元素存到ArrayList集合中,并去除重复元素。

  2. import java.util.*;

  3. class Person
  4. {
  5.         private int age;
  6.         private String name;
  7.         
  8.         Person(String name, int age)
  9.         {
  10.                 this.name = name;
  11.                 this.age = age;
  12.         }
  13.         
  14.         public boolean equals(Object obj)       // equals 方法是用来比较的,下面的singleElement 也是用来比较的,它们都在比较什,这个小程序运行的顺序是什么?
  15.         {                                    
  16.                 if(!(obj instanceof Person))   
  17.                         return false;         
  18.                 Person p = (Person)obj;   
  19.                 return this.name.equals(p.name) && this.age == p.age;
  20.         }

  21.         public String getName()
  22.         {
  23.                 return name;
  24.         }
  25.         
  26.         public int getAge()
  27.         {
  28.                 return age;
  29.         }
  30. }

  31. class Test
  32. {
  33.         public static void sop(Object obj)
  34.         {
  35.                 System.out.println(obj);
  36.         }
  37.         
  38.         public static void main(String[] args)
  39.         {
  40.                 ArrayList a = new ArrayList();
  41.                
  42.                 a.add(new Person("lisi01",21));
  43.                 a.add(new Person("lisi02",22));
  44.                 a.add(new Person("lisi03",23));
  45.                 a.add(new Person("lisi03",23));
  46.                 a.add(new Person("lisi04",24));
  47.                 a.add(new Person("lisi05",24));
  48.                
  49.                 a = singleElement(a);
  50.                
  51.                 Iterator i = a.iterator();
  52.                
  53.                 while(i.hasNext())
  54.                 {
  55.                         Person p  =(Person)i.next();               
  56.                         sop(p.getName()+"::"+p.getAge());
  57.                 }
  58.                
  59.         
  60.                
  61.         }
  62.         
  63.         public static ArrayList singleElement(ArrayList a)
  64.         {
  65.                 ArrayList A = new ArrayList();
  66.                
  67.                 Iterator i = a.iterator();
  68.                
  69.                 while(i.hasNext())
  70.                 {
  71.                         Object obj = i.next();
  72.                         if(!A.contains(obj))
  73.                                 A.add(obj);
  74.                 }
  75.                 return A;
  76.         }
  77. }
复制代码
问题: equals 方法在比较什么? singleElement 方法在比较什么?为什么两个方法都存在了程序才能正常运行?这个小程序的执行顺序是怎么样的?

4 个回复

倒序浏览
就是 在你调用contains方法的时候 底层调用了 equals方法

回复 使用道具 举报
equals是object类中定义的比较方法,其他类你上面的类创建默认继承object中的equals方法,
equals用于比较,你可以将其方法覆盖写入你自己的比较规则,比如字符串按照长度比较等。
  1. public boolean equals(Object obj)
  2.         {                                    
  3.                 if(!(obj instanceof Person))   
  4.                 return false;         
  5.                 Person p = (Person)obj;   
  6.                 return this.name.equals(p.name) && this.age == p.age;
  7.     }
复制代码



这段代码就是覆盖掉原来的equals方法定义自己自己的比较规则,先按照姓名比较,再按照年龄比较,
singleElement 方法实现的是将重复的元素去除掉,其内部调用的contains默认会使用equals进行比较判断,
equals判断的依据就是你写入的判断规则

评分

参与人数 1黑马币 +1 收起 理由
枫儿 + 1 哥们 注意提交时间 否则将按规定扣除技术分.

查看全部评分

回复 使用道具 举报
关键代码是这里,

A是一个List,contains就是判断这个List里面是不是含有 obj这样的对象

是调用对象它们的equals方法比较 的。
之前有的对象就不会再加进去了。

最后返回一个List。

20140413141924835.jpg (9.61 KB, 下载次数: 6)

20140413141924835.jpg
回复 使用道具 举报 1 0
你的代码我写了一次,并且在你注释那回答一下你的问题!
/*
*Person类
*/
public class Person {
        private int age;
        private String name;

        Person(String name, int age) {
                this.name = name;
                this.age = age;
        }
/*
*重写equals方法,此处的equals的是Person类中的方法
*主要功能: List集合判断元素是否相同,依据是元素的equals方法。
*/
//布尔型覆盖父类中的object的equals方法
public boolean equals(Object obj)
        public boolean equals(Object obj) {
                if (!(obj instanceof Person))
                        return false;
                Person p = (Person) obj;
     //此处equals方法是字符串中的方法,字符串可以调用equals方法
                return this.name.equals(p.name) && this.age == p.age;
        }

        public String getName() {
                return name;
        }

        public int getAge() {
                return age;
        }
}
以下是Test测试类
public static void main(String[] args) {
                ArrayList a = new ArrayList();
        a.add(new Person("lisi01",21));
        a.add(new Person("lisi02",22));
        a.add(new Person("lisi03",23));
        a.add(new Person("lisi03",23));
        a.add(new Person("lisi04",24));
        a.add(new Person("lisi05",24));
//singleelement(a); 这个方法,就是去掉重复的元素,然后返回给a
        a = singleElement(a);
        Iterator i = a.iterator();
        while(i.hasNext()){
                Person p  =(Person)i.next();
                sop(p.getName()+"::"+p.getAge());
        }
        }
        
        public static void sop(Object obj)
     {
             System.out.println(obj);
     }
         
          public static ArrayList singleElement(ArrayList a)
      {
              ArrayList A = new ArrayList();
              Iterator<String> i =a.iterator();
              while(i.hasNext())
              {
                      Object obj = i.next();
                      if(!A.contains(obj))
                              A.add(obj);
              }
              return A;
      }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马