课程笔记:Hash

哈希函数

1.输入域无穷大,输出有限

例如MD5:长度为16,每位上有16种状态

2.哈希函数输入相同,输出相同;输入不同,输出也可能相同(即哈希冲突)。

3.输出域上每一个点厚度是均匀增长的。

例如:字符串100位S,输出域只有3点M(1,2,3),输出的结果在(1,2,3)上均匀分布,S MOD(1,2,3)

哈希表

每一个数通过哈希函数进行处理的出的结果Mod10(假设分10个文件),在0~9上均匀分布,放入哈希表中

存放的都是有序表,增删改查可以认为是O(1)(通过离线技术实现,类似volatile,且扩容概率很小)

扩容:数量翻一倍,原有函数重新处理,复杂度O(n);

HashMap

是一个散列表,继承于AbstractMap。HashMap 的实现不是同步的,意味着不是线程安全的。它的key、value都可以为null。

hashMap在单线程中使用大大提高效率,在多线程的情况下使用hashTable来确保安全。Map接口未实现Collection接口,使用Iterator

hashTable中使用synchronized关键字来实现安全机制,但是synchronized是对整张hash表进行锁定即让线程独享整张hash表,在安全同时造成了浪费。concurrentHashMap采用分段加锁的机制来确保安全,使用Enumeration

 

Vector:Vector支持线程的同步,也就是内部加锁的

ArrayList:ArrayList 是线程序不安全的,不是同步的。ArrayList删除一个元素后,剩余元素会依次向前移动。当需要增长时,Vector默认增长为原来一倍,而ArrayList却是原来的50%,这样ArrayList就有利于节约内存空间。

 如果涉及到堆栈,队列等操作,应该考虑用Vector,如果需要快速随机访问元素,应该使用ArrayList 。

一致性哈希:

猜你喜欢

转载自blog.csdn.net/weixin_41328649/article/details/85863381