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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© mohuancaizi 中级黑马   /  2014-4-1 18:26  /  1325 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 mohuancaizi 于 2014-4-1 20:03 编辑

ArrayList                al.add(new Person("lisi01", 30));
                al.add(new Person("lisi02", 32));
                al.add(new Person("lisi03", 33));
                al.add(new Person("lisi03", 33));
同样的元素视为同意个人
               

HashSet中                                   
                                     hs.add(new Person("a2",12));
                hs.add(new Person("a3",13));
                hs.add(new Person("a4",14));
                hs.add(new Person("a1",11));
                                   hs.add(new Person("a1",11));

问题:HashSet 和Arraylisht 中 equals的区别在于 哪 ???

                                    

3 个回复

倒序浏览
ArrayList 通常是在使用contains方法的时候 .contains内部调用equals . Person类中去复写equals来判断

而HashSet   在Person类中复写hashCode 和equals方法 来保证元素唯一性

其实equals写出来的代码可以是一样的,只是两个集合调用的不一样
回复 使用道具 举报
本帖最后由 anqi 于 2014-4-1 19:31 编辑

ArrayList添加元素的时候就像数组一样,是按你添加的顺序添加进去的,是隐式的带角标的。
他们的的顺序就是添加时候的顺序。equals方法在添加的时候是用不到的。(可以添加相同元素)
HashSet 是Set集合,它添加的时候元素不是按添加顺序排序,而是先按照hashCode的大小排序,
当hasCode一样的时候就用equals判断大小,这俩方法的意思就是当你添加来一个元素的时候我要
判断下这个元素要被安排在队伍的哪个位置。
用排队形象化的说就是ArrayList是按谁先到谁的位置靠前。HashSet是按一定的顺序排队,
可以按高矮个,可以按年龄,实现的方法就是覆盖Person的hashCode方法和equals方法。
你现在的问题因为都是new对象开辟新空间,添加进去的所有人都是不一样的。(地址值不同)
你想叫同样的属性的元素时同一个人的话就要覆写hashCode和equals方法,改变判断条件。
因为Person默认的hashCode和equals都是继承自Object类。这俩方法的在Object中是比较地址值。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
首先Set存储时无序不可重复的,List是有序可重复的
List中用contains内部调用equals
Set中使用的equals方法是其存入的类(Person或其他)的重写的equals,hashCode方法,举个例子
  1. import java.util.*;

  2. public class Test
  3. {
  4.     public static void main(String[] args)
  5.     {
  6.         HashSet hs = new HashSet();
  7.         hs.add(new  Smile("呵呵"));
  8.         hs.add(new  Smile("呵呵"));
  9.         System.out.println(hs);
  10.         System.out.println("------分割线------");
  11.       
  12.         Smile p1=new Smile("嘿嘿");
  13.         hs.add(p1);
  14.         hs.add(p1);
  15.         System.out.println(hs);
  16.         System.out.println("======分割线======");//Smile继承object的hashCode和equals方法
  17.       
  18.         String s1 = new String("哈哈");
  19.         String s2 = new String("哈哈");
  20.         hs.add(s1);
  21.         hs.add(s2);
  22.         System.out.println(hs);//String类重写过hashCode与equals所以就不同于Smile,不能添加相同的
  23.         
  24.     }
  25.    
  26. }

  27. class Smile
  28. {
  29.     String name;
  30.     Smile(String name)
  31.     {
  32.         this.name=name;
  33.     }
  34.     public String toString() {
  35.             return name;
  36.     }
  37. }
复制代码


输出结果是:[呵呵, 呵呵]
------分割线------
[呵呵, 呵呵, 嘿嘿]
======分割线======
[哈哈, 呵呵, 呵呵, 嘿嘿]

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

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