java基础 -- hashmap

1.数据结构:

1.8之前 使用 链表加数组, 1.8之后 使用链表加数组(大于8之后 使用 红黑树 )
key,vakue 作为 一对 entry 进行存储
java基础 -- hashmap

2. 线程性:

非线程安全的 ,没有加锁,若需要在多线程中使用可以使用 conurrentHashmap 它是线程安全的

3.put的工作原理:

首先 使用put《key,vakue 》 作为一个entry实体 放入 ,然后 对key 使用 hashcode方法,通过返回的hashcode 判断 找到 存储该键值队的 桶bucket
“当两个对象的hashcode相同会发生什么?”当 两个Key 的 hashcode 相同时, 还有equals 方法 就算 hashcode 值一样,但仍然可能不相同 (equals 判断 对象的值是否相等))

此时 会发生 冲突 会将该对想 放入 链表(或者红黑树)中

4.get(当两者的hashcode相同时)

通过 hashcode 找到 bucket ,然后对链表使用key. equals 方法

5. 如果hashmap 的负载 超过了负载因子 怎么办

当负载 超过了 75% hashmap就会 自动的扩容 变为 原来的两倍

6.与hashtabel的区别 :

hashtable 是 线程安全的 ,但是 仅仅允许 一个 线程对当前的hashtable进行修改 效率 太低,在 jdk1.5之后 已经 有了concurrenthashmap 对其进行替代

此处 略带 提及 下 concurrenthashmap : 它是对 里面的segement 进行加锁 每个segment 与 hashmap中的 bucket相类似 所以 最多允许 segement 个数个线程 对
其进行同时访问 。