HashMap是最快的数据结构。
根据key直接算出它的下标位置。
map是查找表。
1.put方法
2.对键值k进行散列算法
就是k.hashcode()。
HashMap可能会出现的问题
在put的时候
两个键的hashcode()的值是一样的。
键值对就是Entry
Entry:有三个变量
key
value
Entry.next记录下一个元素是谁。
出现链表是会降低查询效率。
如果使用java提供的类作为Key,不同对象不会出现相同hashCode()。
hashcode和equals都是object的方法。在重写equals时也要重写hashcode()
在Object定义的时候,hashcode和equals是满足hashmap的使用规则的。
HashMap用散列桶来存储数据。
HashMap默认的初始值是16.
Size:大小,当墙散列表中存储数据的数量。
加载因子:实际存储数据数量和总共能够存储数据数量的大小。
Capacity:容量,hash表里bucket(桶)的数量,也就是散列数组大小。
性能优化:加载因子较小时,散列查找性能会提高,同时也浪费了散列桶空间容量。0.75
size永远不会超过Capacity*0.75.
散列算法会带入两个参数:hashcode值和数组长度。当数组长度变了以后,散列值也会发生变化。
所以每次数组容量改变一次,每个数据的散列值都发生了改变。
为了避免产生链表使用了加载因子,数组容量一旦发生改变,会发生rehash,尽量避免数组少扩容。
HashMap有带有数组容量的构造方法。
HashMap最重要的特点:快。
HashMap要注意的就是:避免产生链表。
可能还要注意数组容量发生变化的情况。
什么情况会产生链表?
1.作为key的hashCode()和equals方法要重写。
2.存的数据只能占总容量的四分之三。
HashMap中与存的数据顺序不一样。
它有一个LinkedHashMap使用链表记录数据顺序。
字符串比较相等一定要用equals(),绝对不能用==。
还有写代码一定要用缩进。