美文网首页
集合框架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