实现类HashSet(java)

HashSet是Set接口实现类之一,使用较为广泛,它不保存元素的加入顺序。HashSet类根据元素的哈希码进行存放,所以取出时也可以根据哈希码快速找到。

下面通过应用示例HashSetTest.java演示HashSet的相关用法。

import java.util.HashSet;
import java.util.Iterator;

public class HashSetTest {
    public static void main(String[] args) {
        HashSet hs = new HashSet();
        hs.add("zxx");
        hs.add("zahx");
        hs.add("zyj");
        hs.add("zmh");
        Iterator iterable = hs.iterator();
        while(iterable.hasNext())
        {
            System.out.println(iterable.next());
        }
    }
}

通过示例可以看出,HashSet添加元素的顺序与迭代显示的结果顺序不一致,这也验证了HashSet不保存元素加入顺序的特征。当然这个示例只是添加了String对象,所以略显简单。如果要添加一个自定义的对象,又该如何?

创建名为Student的JavaBean文件。

public class Student
{
    private int age;
    private String name;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public Student(String name, int age)
    {
        this.age = age;
        this.name = name;
    }
    //要显示Student类的信息,必须重写toString 方法  
    public String toString()
    {
        return "age:"+age+"name:"+name;
    }
    //在Java规范中要求,如果用户重写了equals()方法,就一定要重写hashCode()方法
    //两个对象进行euqals比较时,如果返回true,那么它们的hashCode要求返回相等的值
    public int hashCode()
    {
        return age*name.hashCode();
    }
    //HashSet中加入的对象需要重写hashCode()和equals()方法
    public boolean equals(Object o)
    {
        Student s = (Student) o;
        return  age == s.age && name.equals(name);
    }
}

因为Set集合中不能加入重复的元素,所以对于自定义类,需要提供判断怎样才算重复元素的方法。在本例中,hashCode和quals方法即是用来判断Student对象是否为重复对象的标准方法。

   equals()方法用于比较两个对象是否为相同的对象。在自己实现的equals()方法中用相关条件来进行比较。比如对于Student类,这里用年龄和名字作为条件进行比较,年龄和姓名相同则视为相等的对象。

下面来对hashCode()方法详细介绍。

如果一个容器有100个元素,再添加一个新元素时,是不是需要执行100次equals()方法呢?如果每增加一个元素就要检查一次,那么当元素很多时,后添加到集合中的元素比较次数就非常多了,这样显然会大大降低效率。于是,Java采用了哈希表的原理。哈希算法也称散列算法,是将数据依特定算法直接指定到一个地址上。可以将hashCode()的返回值看作是对象的物理地址的一个索引。添加新元素的时候,先通过索引查看这个位置是否存在元素,如果不存在,则可以直接将元素储存于此,不再需要再调用equals()方法;如果已经存在元素,则再调用equals()方法与新元素进行比较,相同的话就不存了,不相同就散列其他地址。这样就使调用equals()方法的次数大大减少了,提高了运算效率。

import java.util.HashSet;
import java.util.Iterator;

public class SelfHashSetTest {
    public static void main(String[] args) {
        HashSet ha = new HashSet();
        ha.add(new Student("zah",18));
        ha.add(new Student("xmh",31));
        ha.add(new Student("zyj",20));
        ha.add(new Student("zah",28));
        ha.add(new Student("zxx",33));
        //添加相同的元素
        ha.add(new Student("zxx",28));
        ha.add(new Student("zxx",28));
        //添加null元素
        ha.add(null);
        ha.add(null);

        Iterator it = ha.iterator();
        while (it.hasNext())
        {
            System.out.println(it.next());
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42103959/article/details/80470708