集合框架Set----HashSet

用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()返回的哈希值;去重上效率更高。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今日任务 1、List接口介绍(掌握常用List特有方法)2、练习3、ArrayList介绍(必须清楚集合的特征、...
    Villain丶Cc阅读 1,082评论 1 1
  • 上一篇文章介绍了Set集合的通用知识。Set集合中包含了三个比较重要的实现类:HashSet、TreeSet和En...
    Ruheng阅读 15,726评论 3 57
  • Java集合 1、集合的由来 程序的需求也许并不能确定创建对象的数量,甚至不知道对象的类型,为了满足普适的编程需要...
    小灰灰_5c75阅读 1,024评论 0 0
  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,978评论 0 13
  • 有笔友在以前觉得是一件十分时尚的事情,还记得以前在学校的时候收到好友婉从家乡寄来的信件,身旁的同学都羡慕的不行,在...
    美丽与勇敢阅读 119评论 0 0