java8中HashMap扩容机制-结点的挂载

本文介绍了Java8中HashMap的数据结构、成员变量以及其扩容机制。HashMap采用数组+链表+红黑树实现,允许一个key为null,多个value为null。在put元素时,当元素数量超过阈值(容量*负载因子0.75)时,HashMap会进行扩容。扩容发生在插入元素后,且当元素达到一定数量时,链表会转换为红黑树。resize方法会将容量和阈值扩大两倍,并调整已存在的元素位置。
摘要由CSDN通过智能技术生成

java8中HashMap扩容机制-结点的挂载

HashMap简介+成员变量

1.HashMap在底层数据结构上采用的是 :数组+链表+红黑树,通过散列映射储存键值对数 据,故查询时访问速度比较快;HashMap最多允许一对键值对的key值为null,允许多对键值对的value为null;排列无序,非线程安全。
2.Node<K,V>:链表的节点,包含了key,value,hash,next 四个元素。
3. size:记录元素的个数。
4.table:Node<K,v>类型的数组,里面元素为链表,储存元素。
5.LoadFactor:负载因子(0.75)。
6.threshold:阀值,决定HashMap在什么时候进行扩容,以及扩容后的大小。阀值=容量*负载因子

put方法

自己实现put方法代码,,仅仅适用于无扩容情况时,如下:

/**
	 * 添加数据
	 */
	@Override
	public void put(K key, V value) {
   
		int index = (key == null) ? 0 : key.hashCode() % table.length;// 数组的索引

		Entry<K, V> data = new Entry<>(key, value);
		Node<K, V> newNode = new Node<>(data, null);

		if (table[index] == null) {
    // 空链表无节点
			table[index] = newNode;
		} else {
   
			Node<K, V> tmp = table[index];
			while (tmp != null && tmp.next != null) {
    // 尾插法
				if (tmp.data.getKey() == key || tmp.data.getKey().equals(key)) {
   
					tmp.data.setValue(value);
					return;
				}
				tmp=tmp.next;
			}
			if (tmp.data.getKey() == key || tmp.data.getKey().equals(key)) {
   
				tmp.data.setValue(value);
				return;
			}
			tmp.next = newNode;
		}
		this.size++; // 容量大小+1
	}

源码如下:

final V putVal(int hash
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值