黑马程序员技术交流社区

标题: 跪求大神指导,集合中contains的用法。 [打印本页]

作者: 塔罗    时间: 2014-6-3 22:41
标题: 跪求大神指导,集合中contains的用法。
  1. package day14.collectionDemo;

  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. class Person{
  5.         private String name;
  6.         private int age;
  7.         Person(String name,int age){
  8.                 this.name = name;
  9.                 this.age = age;
  10.         }
  11.         public void setAge(int age){
  12.                 this.age = age;
  13.         }
  14.         public void setName(String name){
  15.                 this.name =name;
  16.         }
  17.        
  18.         public String getName(){
  19.                 return name;
  20.         }
  21.         public int getAge(){
  22.                 return age;
  23.         }
  24. //        为什么要重写equals 方法呢?
  25.         public boolean equals(Object obj){
  26.                 if(!(obj instanceof Person)){
  27.                         return false;
  28.                 }
  29.                 Person p = (Person)obj;
  30.                 return this.name.equals(p.name) && this.age == p.age;
  31.         }
  32.        
  33. }
  34. public class ArrayListText2 {
  35.         public static void main(String []args){
  36.                 ArrayList al = new ArrayList();
  37.                 al.add(new Person("liwu1",32));
  38.                 al.add(new Person("liwu2",32));
  39.                 al.add(new Person("liwu3",32));
  40.                 al.add(new Person("liwu4",32));
  41.                 al.add(new Person("liwu1",32));
  42. //                掉用方法。去掉重复
  43.                 al =singleElements(al);
  44. //                生成一个迭代器。
  45.                 Iterator it = al.iterator();
  46.                 while(it.hasNext()){
  47.                         Person p = (Person)it.next();
  48.                         System.out.println(p.getName()+"..."+p.getAge());
  49.                 }
  50.         }
  51.        
  52.         public static ArrayList singleElements(ArrayList al2){
  53. //                定义一个临时容器。
  54.                 ArrayList newAl = new ArrayList();
  55.                
  56.                 Iterator it = al2.iterator();
  57.                
  58.                  while(it.hasNext()){
  59.                          
  60.                          Object obj = it.next();
  61. //         这contains怎么比较这个集合中是否包含这个对象?
  62.                          if(!newAl.contains(obj)){
  63.                                  newAl.add(obj);
  64.                          }
  65.                  }return newAl;
  66.         }
  67. }
复制代码


如代码所示:这个一个集合中除去重复的对象。
问题1:我的Person类中为什么要重写 equals()方法。
            为什么重写。确去不掉重复呢?关键是,我又没有在什么地方调用这个 equals()方法。
问题2:contains 里面判断集合是否包含 对象。是怎么判断呢?
作者: shisishishisi    时间: 2014-6-4 03:34
其实你的2个问题是一个问题!contains判断集合中是否包含某个元素即调用了equals方法
而对于引用类型若不重写equals则使用的是Object的equals方法,比较的是对象在内存中的地址
这样就达不到你要判断一个集合中是否含有某个元素的目的!所以要重写equals方法!
作者: More    时间: 2014-6-4 07:28
newAl.contains(obj),系统会对Arraylist中的每个元素e调用obj.equals(e),这个时候已经调用了equals()方法,而且在java中规定要重写equals()方法  要遵守这个规定
作者: 侯金龙    时间: 2014-6-4 07:53
重写equals是要有自己的比较方法,以便操作对象,contains的操作应该是,先获取每个元素然后比较
作者: 茂子    时间: 2014-6-4 08:52
这段代码相当于是去掉集合中的重复元素,将不重复的元素放到一个新集合中。
1、虽然equals方法没有被调用,但是在集合元素的判断中会默认的调用该函数,contains方法应该就是调用了该方法比较(个人理解);
2、在没有重写equals方法时,默认调用的equals方法只是对元素的地址值进行比较。然而该段代码,集合每次添加一个对象元素(new Person("xxx",int)),在堆内存中都会开辟一个新的地址值,所以不复写equals方法就默认的比较这些地址值,而每次开辟的新空间是不可能存在重复的;
3、重写equals的主要目的在于建立自定义的比较方式,以此剔除重复元素。
作者: 提菩--空    时间: 2014-6-4 10:17
ArrarList是可存重复的数据,另外person元素本身不具有比较性,要去掉重复的元素,得让元素具有比较性,二种方式,1,元素实现comparable接口,覆盖compareTo方法。2、实现comparator接口,覆盖compare方法
作者: Dark_Horse    时间: 2014-6-4 11:12
说的很详细...
作者: 塔罗    时间: 2014-6-4 20:50
茂子 发表于 2014-6-4 08:52
这段代码相当于是去掉集合中的重复元素,将不重复的元素放到一个新集合中。
1、虽然equals方法没有被调用, ...

嗯。确实,在用contains进行比较的时候,自动调用的equals。
作者: 塔罗    时间: 2014-6-4 20:53
侯金龙 发表于 2014-6-4 07:53
重写equals是要有自己的比较方法,以便操作对象,contains的操作应该是,先获取每个元素然后比较 ...

嗯。主要当时不是很理解 contains 是怎么进行比较。不过现在想想,contains 会自动调用equals的方法进行比较的。
作者: 塔罗    时间: 2014-6-4 20:55
提菩--空 发表于 2014-6-4 10:17
ArrarList是可存重复的数据,另外person元素本身不具有比较性,要去掉重复的元素,得让元素具有比较性,二 ...

compare 这个方法我在研究研究,现在不是很清楚,谢谢了   
作者: 塔罗    时间: 2014-6-4 20:57
shisishishisi 发表于 2014-6-4 03:34
其实你的2个问题是一个问题!contains判断集合中是否包含某个元素即调用了equals方法
而对于引用类型若不重 ...

对。谢谢了哦。




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