HashTable的学习

HashTable的学习

一.继承关系,初始默认值,底层数据结构,基本属性,扩容机制
在这里插入图片描述

底层数据结构: 数组+链表
数组的初始大小=11
扩容机制:(count >= threshold) 存储entry实体个数大于阈值
threshold = (int)Math.min(newCapacity(初始容量值) * loadFactor, MAX_ARRAY_SIZE + 1) //数组大小*加载因子
加载因子:loadFactor (0.75)
扩容方式:int newCapacity = (oldCapacity << 1) + 1; //二倍的扩容方式
基本属性:private transient int count; //记录集合中存在的元素
private transient Entry<K,V>[] table; //Entry类型的数组 {key value next hash}
private int threshold; //扩容阈值
private float loadFactor; //加载因子
hashSeed 底层操作系统相关值
继承关系:extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable {

二.构造函数
HashTable一共有四个构造函数:
这四个构造函数中第一个传入一个Map,用来初始大小;第二个无参构造,初始化table[]的大小,为11;第三个传入一个参数(int initiaCapacity),是初始容量;最够一个传入两个参数(int initiaCapacity,float loadFactor),这也是最重要的一个构造函数,其余三个构造函数都是根据这个构早函数来初始化,在这个构造函数中一共做了三件事情:

public Hashtable(int initialCapacity, float loadFactor) {
参数校验
扩容阈值处理
赋初值
}

三.put的流程
在这里插入图片描述

1.若(value == null),该集合中没有元素,直接抛出异常 throw new NullPointerException(); //空指针异常
2.创建Entry类型的数组tab,将原来的table赋给他
3.计算key的hash,通过index找到索引位置
4.找到索引位置,再从该位置头节点开始遍历(tab[index] Entry e),如果存在就想进行覆盖
5.如果元素个数(count) >= 扩容阈值(threshold) 进行resize扩容方法,然后进行重hash,对OldValue所有数据进行重hash
6.创建一个新的Entry节点(要插入的数据),将这个节点插入到链表当中(头插)

四.线程安全性
HashTable是线程安全的,因为它加了synchronized关键字,synchronized(put/remove/get)关键字加在方法上,作用于类的实例上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值