HashMap是基于哈希表的Map接口实现,以key-value的形式存在。在HashMap中,key-value总是会被当作一个整体来处理。系统会根据hash算法来计算key-value的存储位置。
01 HashMap扩容
HashMap(int initCapacity,float loadFactor):构造一个带指定初始容量和加载因子的空HashMap
初始容量:表示哈希表中桶的数量。 加载因子:是哈希表在其容量自动增加之前可以达到多满的一种尺度,衡量的是一个散列表空间的使用程度。
负载因子越大表示散列表的装填程度越高,反之越小。
如果负载因子越大,对空间利用越充分,查找效率会降低。如果负载因子太小,散列表的数据过于稀疏,对空间造成浪费。默认负载因子0.75,一般无需修改。
02 HashMap保存数据的过程
首先判断key是否为null。若为null,直接调用putForNullKey方法。若不为空,则先计算key的hash值,然后根据hash值搜索在table数组中的索引位置,如果table数组在该位置处有元素,则通过比较是否存在相同的key,若存在则覆盖原有key的value。否则,将该元素保存在链头。若table中没有该元素,则直接保存。
当length = 2^n 时,不同的hash值发生碰撞的概率较小,这样会使得数据在table数组中分布较均匀,查询速度也更快。
03 与LinkedHashMap、TreeHashMap的不同
HashMap保存了记录的插入顺序,再用清水Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。遍历时比HashMap慢,但是当HashMap容量很大,数据很小的时候,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只与实际数据有关,和容量无关。
TreeMap实现了SortMap接口,能够把它保存的记录,根据键排序,默认是按照键的升序。也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。