黑马程序员技术交流社区

标题: HashSet 和Arraylisht 中 equals的区别 [打印本页]

作者: mohuancaizi    时间: 2014-4-1 18:26
标题: HashSet 和Arraylisht 中 equals的区别
本帖最后由 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的区别在于 哪 ???

                                    


作者: osully    时间: 2014-4-1 19:12
ArrayList 通常是在使用contains方法的时候 .contains内部调用equals . Person类中去复写equals来判断

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

其实equals写出来的代码可以是一样的,只是两个集合调用的不一样
作者: anqi    时间: 2014-4-1 19:29
本帖最后由 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中是比较地址值。
作者: 宋超2356    时间: 2014-4-1 19:39
首先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. }
复制代码


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






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