HashSet的特性介紹

風痕影默發表於2014-09-15

HashSet除了在元素的儲存上是無序的以外,還是不能夠儲存重複的元素。

HashSet如何判斷元素是否重複呢?是根據元素繼承的兩個方法來判斷,hashCode和equals,當儲存元素時,首先判斷要存入的元素和已存在的元素的雜湊值是否相同,若不相同存入,若相同則利用equals判斷兩個元素是否相同,若不相同,則存入,若相同則放棄。而hashCode和equlas是在存入元素自動呼叫的。

一下繼續利用Person類舉例

import java.util.*;

class Person

{

    private String name; //姓名

    private int age;    //年齡

 

    public Person(String name, int age)

    {

        this.name = name;

        this.age = age;

    }

    //用於生成自定義的雜湊值

    public int hashCode()

    {

        return this.name.hashCode()+this.age*36;

    }

    //自己定義比較規則,與ArrayList相同

    public boolean equals(Object obj)

    {

        if(!(obj instanceof Person))

            return false;

        Person p = (Person)obj;

        return p.getName().equals(this.getName()) && (p.getAge() == this.getAge());

    }

    public String getName()

    {

        return this.name;

    }

 

    public int getAge()

    {

        return this.age;

    }

 

    public void setName(String name)

    {

        this.name = name;

    }

 

    public void setAge(int age)

    {

        this.age = age;

    }

}

 

public class Test

{

    public static void main(String[] args)

    {

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

 

        hs.add(new Person("zhangsan", 23));

        hs.add(new Person("lisi", 23));

        hs.add(new Person("zhangsan", 23));

        hs.add(new Person("wangwu", 35));

        hs.add(new Person("zhangsan", 67));

        hs.add(new Person("zhaoliu", 45));

 

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

 

        while(it.hasNext())

        {

            Person p = it.next();

            System.out.println(p.getName()+"...."+p.getAge());

        }

    }

}

 

相關文章