美文网首页
集合框架Set----HashSet

集合框架Set----HashSet

作者: 东风谷123Liter | 来源:发表于2018-09-15 10:18 被阅读0次

    用HashSet集合来存储Person类对象;

    具体思路:

    HashSet的特性就是无序性和不重复性,
    所以我们往里面存储Person对象的时候就可实现:去除重复对象的功能;

    通过这个例子的学习,我们发现:

    HashSet类型对象的add()方法底层就调用了equals()方法,
    它可以让每一个新添加的元素与集合中已经存在的元素进行比较,看集合中是否
    存在该元素,如存在就不添加进集合。具体比对的方法也有讲究:
    它是先比较Person对象的hashCode()方法返回的值,然后再比较对象各个私有成员变量。
    hashCdoe()是一个Object类下的方法,不是集合中的,String类也又该方法,该方法详细情况请参考文档。

    再深入,我们又会遇到两问题:

    1,给Person对象添加了hashCode()方法,获得哈希值;但好像比对的过程存在冗余的情况;
    2,为此我们还得重写HashSet集合对象add()方法中的equals()方法!
    解释完毕,再接再厉!
    */

    package jihe;
    import java.util.*;
    class Person{
        private int age;
        private String name;
        Person(int a, String n){
              this.age = a;
              this.name = n;
        }
        public int hashCode() {
         //如果返回60 ,就是意味着每个对象的哈希值都相同,这不利于去除重复元素中对象间的比较。
         return 60;
         //所以我们在获取对象的哈希值时,要根据对象的自变量来获取,这样我们就能保证每个对象都有不同的哈希值。
         //常用获取哈希值的格式如下;其中age*24没有什么特别的意义,只是为了增强哈希值的不重复性,
         //24可以用其他数字代替,数值大小不要过大或过小即可。
         //return name.hashCode()+age*24;
        }
        public boolean equals(Object obj) {
         if(!(obj instanceof Person))
               return false;
         Person p = (Person)obj;     System.out.println(name+"::::equals:::"+p.name);
         return p.getName().equals(name) && p.getAge()==age;
        }
        public int getAge() {
              return age;
        }
        public String getName() {
              return name;
        }
    }
    public class hashset_person {
          public static void main(String[] args) {
                HashSet<Person> hs = new HashSet<Person>();
              hs.add(new Person(23, "lily"));
              hs.add(new Person(23, "tom"));
              hs.add(new Person(34, "lily"));
              hs.add(new Person(23, "tom"));//重复元素
              sop(hs);       
          }
          public static void sop(HashSet hs) {
                Iterator<Person> it = hs.iterator();
              while(it.hasNext()) {
               Person p = (Person)it.next();              
     System.out.println(p.getName()+"===="+p.getAge());
              }
          }
    }
    
    image.png

    当我们把hahsCode()方法中的return 60;换成return name.hashCode()+age*24;就会有以下结果:

    image.png

    我们还可以在hashCode()中加上System.out.println(name+"....hashCode");效果更显而易见:

    image.png

    总结:以后遇到HashSet集合的使用基本都要重写hashCode()和equals()方法!

    除了添加元素需要这样判断,删除元素也是一样的;HashSet集合和ArrayList在这两个功能上都依赖equals()方法;只是HashSet集合它还要先判断hashCode()返回的哈希值;去重上效率更高。

    相关文章

      网友评论

          本文标题:集合框架Set----HashSet

          本文链接:https://www.haomeiwen.com/subject/rhyzgftx.html