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
- HashSet
- Hashset
- HashSet
- HashSet
- HashSet
- HashSet
- HashSet
- HashSet
- HashSet
- HashSet
- HashSet
- HashSet
- HashSet
- HashSet
- HashSet
- HashSet
- hashset
- HashSet
- 内存与链表
- HDFS和hbase
- android开发查漏补缺图
- CentOS6.5 + Nginx1.10.2 + FastDFS5.08
- 5.视图
- HashSet
- 《Effective C++》学习笔记——条款45
- 技术的坚持
- 像素缓冲区对象(PBO)的异步Read-Back 源码解析
- Linux进程管理简介及进程管理工具
- Android 性能优化 内存优化 How to do
- Codeforces Round #379 (Div. 2)
- Linux内核移植--开机动画
- AngularJS 的基础使用