HashSet

来源:互联网 发布:淘宝网如何注销账户 编辑:程序博客网 时间:2024/05/01 01:42

Set:元素是无序的(存入和取出的顺序不一定一致),元素不可重复。

HashSet:底层的数据结构是哈希表,线程不安全且不同步。

HashSet通过hashCode和equals来保证元素的唯一性。

1.如果元素的hashCode值相同,那么会判断equals,从而判断元素是否相同;

2.如果hashCode值不相同,则元素不同,不再判断equals。


下面贴下一段代码解释:

自定义hashCode,通过姓名和年龄不同判断不同的人。

import java.util.HashSet;import java.util.Iterator;public class HashSetDemo {public static void main(String[] args) {HashSet<Person> hs=new HashSet<Person>();hs.add(new Person("张三",20));hs.add(new Person("张三",21));//add添加是Object类型hs.add(new Person("张三",20));hs.add(new Person("李四",20));Iterator<Person> it=hs.iterator();while(it.hasNext()){Person p=(Person)it.next();System.out.println(p.getName());System.out.println(p.getAge());System.out.println(p.hashCode());//注意这里的hashCode的输出}}}
public class Person {private String name;private int age;Person(String n,int a){this.name=n;this.age=a;}public String getName(){return this.name;}public int getAge(){return this.age;}public int hashCode()//默认是以地址来判断{System.out.println(name.hashCode());return name.hashCode()+age*37;//自定义,通过名字和年龄判断。如果不是自定义,默认new的每个对象都是不同hashCode的。}public boolean equals(Object o){if(o instanceof Person){Person oo=(Person)o;//System.out.println(oo.getname());return this.name.equals(oo.getName())&&this.age==oo.age;}elsereturn false;}}
输出结果:

775629
775666
775629
842801
张三
20
775629
775629
张三
21
775666
775666
李四
20
842801
842801


我们从结果知道,(姓名,年龄)的hashCode不相同时,就直接知道是不同元素,而(“张三”,20)hashCode相同时,则需判断equals方法是true表示是相同,所以添加的两个(“张三”,20)是相同的,只记录一个。

注意:如果不是自定义,则new的每个对象的hashCode都是不同的。

ps:有误欢迎指出来。

0 0
原创粉丝点击