集合 hashset

HashSet集合介绍

HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法。

 

HashSet集合存储数据的结构(哈希表)

什么是哈希表呢?

哈希表底层,使用的也是数组机制数组中也存放对象,而这些对象往数组中存放时的位置比较特殊,当需要把这些对象给数组中存放时,那么会根据这些对象的特有数据结合相应的算法,计算出这个对象在数组中的位置,然后把这个对象存放在数组中。而这样的数组就称为哈希数组,即就是哈希表

 

object hashCode     equals

 

当向哈希表中存放元素时,需要根据元素的特有数据结合相应的算法,这个算法其实就是Object类中的hashCode方法。由于任何对象都是Object类的子类,所以任何对象有拥有这个方法。即就是在给哈希表中存放对象时,会调用对象的hashCode方法,算出对象在表中的存放位置,这里需要注意,如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法,比较这两个对象是不是同一个对象,如果equals方法返回的是true,那么就不会把第二个对象存放在哈希表中,如果返回的是false,就会把这个值存放在哈希表中。

 

总结:保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。

 

 HashSet存储JavaAPI中的类型元素

给HashSet中存储JavaAPI中提供的类型元素时,不需要重写元素的hashCode和equals方法,因为这两个方法,在JavaAPI的每个类中已经重写完毕,如String类、Integer类等。

 

l  创建HashSet集合,存储String对象。

publicclass HashSetDemo {

     publicstaticvoid main(String[] args) {

         //创建HashSet对象

         HashSet<String> hs = new HashSet<String>();

         //给集合中添加自定义对象

         hs.add("zhangsan");

         hs.add("lisi");

         hs.add("wangwu");

         hs.add("zhangsan");

         //取出集合中的每个元素

         Iterator<String> it = hs.iterator();

         while(it.hasNext()){

              String s = it.next();

              System.out.println(s);

         }

     }

}

输出结果如下,说明集合中不能存储重复元素:

wangwu

lisi

zhangsan

 

HashSet存储自定义类型元素

 如果是自定义的类型      必须要重写hashcode  equals、

给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一

 

例子

l  创建自定义对象Student

publicclass Student {

     private String name;

     privateintage;

     public Student(String name, int age) {

         super();

         this.name = name;

         this.age = age;

     }

     public String getName() {

         returnname;

     }

     publicvoid setName(String name) {

         this.name = name;

     }

     publicint getAge() {

         returnage;

     }

     publicvoid setAge(int age) {

         this.age = age;

     }

     @Override

     public String toString() {

         return"Student [name=" + name + ", age=" + age + "]";

     }

     @Override

     publicint hashCode() {

         finalint prime = 31;

         int result = 1;

         result = prime * result + age;

         result = prime * result + ((name == null) ? 0 : name.hashCode());

         return result;

     }

     @Override

     publicboolean equals(Object obj) {

         if (this == obj)

              returntrue;

         if(!(obj instanceof Student)){

              System.out.println("类型错误");

              returnfalse;

         }

         Student other = (Student) obj;

         returnthis.age ==  other.age&&this.name.equals(other.name);

     }

}

l  创建HashSet集合,存储Student对象。

publicclass HashSetDemo {

     publicstaticvoid main(String[] args) {

          //创建HashSet对象

         HashSet hs = new HashSet();

         //给集合中添加自定义对象

         hs.add(new Student("zhangsan",21));

         hs.add(new Student("lisi",22));

         hs.add(new Student("wangwu",23));

         hs.add(new Student("zhangsan",21));

         //取出集合中的每个元素

         Iterator it = hs.iterator();

         while(it.hasNext()){

              Student s = (Student)it.next();

              System.out.println(s);

         }

     }

}

输出结果如下,说明集合中不能存储重复元素:

Student [name=lisi, age=22]

Student [name=zhangsan, age=21]

Student [name=wangwu, age=23]

 

posted @ 2019-02-26 11:39  小白WY  阅读(169)  评论(0编辑  收藏  举报