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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 轩辕迪卡 中级黑马   /  2013-11-10 13:44  /  1270 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class TestSet {

        public static void main(String[] args) {
                Set set = new HashSet();
                Person p1=new Person();
                Person2 p2=new Person2();
                set.add(p1);
                set.add(p2);
                System.out.println(set.size());
               
        }
}




class Person {
        @Override
        public boolean equals(Object obj) {
                return true;
        }
        
}


public class Person2 {
        @Override
        public boolean equals(Object obj) {
                return true;
        }
}

我运行的结果是2,不是equals返回true就是同一个元素吗?

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
比较的是hashCode()方法和equals()方法,这样才可以保证元素的唯一性,

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1

查看全部评分

回复 使用道具 举报
  1. package itheima.october10;

  2. import java.util.HashSet;
  3. import java.util.Iterator;
  4. import java.util.Set;

  5. public class TestSet {

  6.     public static void main(String[] args) {
  7.             Set set = new HashSet();
  8.                 Person p1=new Person();
  9.                 Person p2=new Person();
  10.                 Person2 p3 = new Person2();
  11.                 Person2 p4 = new Person2();
  12.                 
  13.             
  14.                 System.out.println(p1.hashCode() == p2.hashCode()); //hashCode不等
  15.                 System.out.println(p1.equals(p2)); //equals相等
  16.                 
  17.                 System.out.println(p3.hashCode() == p4.hashCode()); //hashCode相等
  18.                 System.out.println(p3.equals(p4)); //equals相等
  19.             set.add(p1);
  20.             set.add(p2);
  21.             set.add(p3);
  22.             set.add(p4);
  23.             
  24.             System.out.println(set.size());
  25.             Iterator it = set.iterator();
  26.             while(it.hasNext()){
  27.                     System.out.println(it.next());
  28.             }
  29.            
  30.     }
  31. }

  32. class Person {
  33.     @Override
  34.     public boolean equals(Object obj) {
  35.             return true;
  36.     }
  37.    
  38. }

  39. class Person2 {
  40.     @Override
  41.     public boolean equals(Object obj) {
  42.             return true;
  43.     }

  44.     @Override
  45.     public int hashCode() {
  46.             return 1;
  47.     }
  48. }

  49. /**
  50. * set进行对象是否相同的比较时候,需要先去比较两者的hashcode是否相等,若不相等则认为两个对象不同,直接存入set,p1,p2没有重写hashcode,hashcode值不同,直接存入set了
  51. * 当 两个对象hashcode值相同时候,才会继续调用对象各自的equals方法,若是两者也相同,才认为是同一个对象。
  52. * Person2类重写了hashcode()方法和equals()方法,这样才能达到预期的比较效果。
  53. * 结论:在重写equals()方法时候,必须同时重写hashCode()方法,这样才能达到去重的效果 。
  54. * 另外,如果需要输出,还需要重写toString()方法,我这里就不重写了。
  55. * 验证:若将Person2的hashcode()方法拷贝到Preson类中,set集合只能存储一个元素,不信你可以试试
  56. *
  57. *
  58. * */
复制代码

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1

查看全部评分

回复 使用道具 举报
关于HashSet集合重复元素去除的问题,毕老师在讲集合类中的HashSet那节的练习中已经有了着重的讲解,建议卤煮再去仔细看看那段视频。首先,集合类型不一样,那么各个集合判断元素是否重复的方法也不一样。
<1>在ArrayList集合中,判断和删除相等的元素时,只需要依靠equals方法就可以了。比如以下代码:equals方法由contains方法在底层调用,如果equals方法的返回值为true那么重复的元素就不在添加到新的集合中去,反之则添加,从而实现了重复元素的判断和删除。
  1. public class HashSetTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                  ArrayList list = new ArrayList();
  6.          Person p11=new Person();
  7.          Person p12=new Person();

  8.          set.add(p11);
  9.          set.add(p12);

  10.          System.out.println("before:"+set.size());
复制代码
<2>然而在HashSet集合中,判断和删除相等的元素时,不仅要依靠equals方法还需要依靠Hashcode方法。,至于为什么要使用HashCode方法,那是因为每个字符串都有自己特定的哈希值。如果哈希值不同那么久可以直接去除,不用再将对象的内容进行比较,哈希值相同在进行对象内容的比较,此方法可以减少对象比较次数,从而节省系统资源。
你的程序中使用的是HashSet集合,却在两个Person类中只复写了equals方法,因为对象在内存中的地址值都不一样,所以JVM认为是两个不同的元素,从而没有达到去除重复元素的效果。修改后:
  1. import java.util.HashSet;
  2. import java.util.Set;


  3. public class HashSetTest
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                  Set set = new HashSet();
  8.          Person p11=new Person();
  9.          Person p12=new Person();

  10.          set.add(p11);
  11.          set.add(p12);

  12.          System.out.println(set.size());
  13.         }

  14. }

  15. class Person {
  16.     @Override
  17.     public boolean equals(Object obj) {
  18.             return true;
  19.     }
  20.     public int hashCode() {
  21.         return 1;
  22.    
  23. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马