hash算法的概念
Hash就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
hash表
Hash表也称散列表,也有直接译作哈希表,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找。Hash表采用一个映射函数 f : key —> address 将关键字映射到该记录在表中的存储位置,从而在想要查找该记录时,可以直接根据关键字和映射关系计算出该记录在表中的存储位置.
HashSet和HashMap
在java中,Hashmap和HashSet都是采用键值对的形式存储数据。它们的实现用到了HashCode()和equals方法。
HashSet
Set集合默认的情况下,会根据是否同一个对象来判断重复与否。 HashSet在判定两个元素是否重复的时候,用调用hashcode方法和equals方法,只有在两个对象的hashcode方法返回同一个值,并且equals为true的情况下,它才会认为这是两个重复对象。先调hashcode,如果值一样,再调用equals
HashMap
HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。
HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。
HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。
HasnMap内部有自己的扩容机制。HashMap内部有:
变量size,它记录HashMap的底层数组中已用槽的数量;
变量threshold,它是HashMap的阈值,用于判断是否需要调整HashMap的容量(threshold = 容量*加载因子)
变量DEFAULT_LOAD_FACTOR = 0.75f,默认加载因子为0.75
HashMap扩容的条件是:当size大于threshold时,对HashMap进行扩容