HashSet
HashSet
哈希表
又叫散列表,用来保存键值对(key,value), 就是一个数组中,每个元素都是一个单向链表
根据添加元素的hash值,通过hash算法,就能够确定要把元素添加到哪个链表中
hash算法
一种安全加密算法,把不定长的值,更改为定长的值,不能保证其值的唯一性
java中指的是 hashCode()函数
算法包括
1 直接寻址法
2 数字分析法
3 平方取中法
4 随机数
5 除数取余法
目标
给每个对象生成一个唯一的标识符
目的
为了查询快,hash值是一个固定的值,整型值,所以在定长的情况下,查询极快
HashSet和HashMap
1 HashSet 就是HashMap的一个封装,只不过把value值屏蔽了
2 HashMap中是key,value 键值对 但是在HashSet中 只有 key
如何向hash表中添加数据
1 添加的时候,HashMap保存的是映射关系,这个映射关系靠 Map.Entry(K,V) 来维护,是一个接口
2 添加过程
先调用要存储的映射关系的key对象,调用key对象的hashCode()方法,生成hash码值
然后根据hash值通过hash算法进行hash,得到数组下标,然后想数组中添加元素
如果数组中还没有对应的hash的数据,就占用一个数组的空间,保存这个key-value的映射关系
如果有,就调用key的equals方法,挨个在hash值相同的链表中,进行比较,如果返回true,那么代表 该链表中有这个key
如果已经有这个元素.key不添加,value值覆盖原来的value
如果equals方法返回false,说明两个对象只是hash值相同,但是并不是同一个对象
那么就把该对象插入到链表中
HashSet 只保存一个元素
HashMap 保存键值对
添加的元素 要实现equals方法和hashCode方法
public class Collection_13_Set_01 {
public static void main(String[] args) {
Set s = new HashSet();
s.add(1);
s.add(21);
s.add(13);
System.out.println(s);
HashSet hs = new HashSet();
Employee e1 = new Employee("1000","obama");
Employee e2 = new Employee("1000","obalv");
Employee e3 = new Employee("2000","张三");
Employee e4 = new Employee("3000","张三");
Employee e5 = new Employee("4000","张三");
Employee e6 = new Employee("5000","李四");
System.out.println(e1.hashCode());
System.out.println(e2.hashCode());
System.out.println(e3.hashCode());
System.out.println(e4.hashCode());
System.out.println(e5.hashCode());
System.out.println(e6.hashCode());
hs.add(e1);
//如果重复 就不添加
hs.add(e2);
hs.add(e3);
hs.add(e4);
hs.add(e5);
hs.add(e6);
System.out.println(hs.size());
for(Object object : hs) {
System.out.println(object);
}
}
}
class Employee{
String no;
String name;
public Employee(String no,String name) {
super();
this.no = no;
this.name = name;
}
public boolean equals(Object obj) {
System.out.println("equals执行了");
if(this == obj) {
return true;
}
if(obj instanceof Employee) {
Employee e = (Employee) obj;
if(no.contentEquals(e.no)) {
return true;
}
}
return false;
}
static int i = 16;
public int hashCode() {
System.out.println("hashCode执行了");
return no.hashCode();
}
public String toString() {
return "Employee [no=" + no + ",name = " + name + "]";
}
}