Java_HashSet ——恋天小结

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 + "]";
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值