1、HashMap的原理
数组:存储区间连续,占用内存严重,寻址容易,插入删除困难;
链表:存储区间离散,占用内存比较宽松,寻址困难,插入删除容易;
Hashmap综合应用了这两种数据结构,实现了寻址容易,插入删除也容易。
HashMap的工作原理 :HashMap是基于散列法(又称哈希法)的原理,使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。
当我们给put()方法传递键和值时,根据键值key计算hash值得到插入的数组索引,用key遍历数组索引位置链表,如果key不存在,将节点添加到链表的末尾;如果key存在,这个节点的value将被新的值覆盖。
当我们用get(key)方法从HashMap中获取对象时,根据键值key计算hash值得到插入的数组索引,然后用key遍历数组索引位置链表,比较链表节点的内部元素是否与key相等,若都不相等,返回null。相等,则取出相等记录的value。
2、HashMap可以在并发环境使用吗?
不可以。HashMap在超过预定容量时,会触发扩容和rehash操作,会造成循环引用。
3、HashMap中的key可以为null吗?
HashMap允许null键和null值,但必须保证键的唯一性。null key总是存放在Entry[]数组的第一个元素。
4、HashMap中Object可以作为key吗?
可以,但是必须要重写hashcode()和equals()这两个方法。
如果不重写这两个方法会怎么样呢?假设我们创建了这个对象的两个实例,分别为obj1和obj2。obj1和obj2是完全一样的,因为他们的所有的属性都是相同的。
但是在使用HashMap的put()方法时,obj1和obj2还是会被放入不同的桶中。因为Object类中存在hashcode()和equals()两个方法,hashcode默认情况下和内存中的地址相关。因此obj1和obj2在调用hashcode()方法的时候会生成不同的哈希值。同时equals也要进行重写,来定义两个对象在什么情况下视作相等。



