当前位置: 首页 > wzjs >正文

网站文件大小查询收录

网站文件大小,查询收录,平面设计网站推荐,wordpress 中文 插件HashMap 的基本概念 HashMap 是 Java 集合框架中的一种基于哈希表的 Map 实现。它存储键值对(key-value),允许 null 键和 null 值,且不保证元素的顺序。HashMap 通过哈希算法快速定位元素,理想情况下时间复杂度为 O(1)…

HashMap 的基本概念

HashMap 是 Java 集合框架中的一种基于哈希表的 Map 实现。它存储键值对(key-value),允许 null 键和 null 值,且不保证元素的顺序。HashMap 通过哈希算法快速定位元素,理想情况下时间复杂度为 O(1)。

HashMap 的核心结构

HashMap 的核心数据结构是数组 + 链表/红黑树。数组的每个元素称为桶(bucket),每个桶存储一个链表或红黑树。当链表长度超过阈值(默认 8)时,链表会转换为红黑树以提高查询效率;当红黑树节点数小于阈值(默认 6)时,会退化为链表。

// 核心字段
transient Node<K,V>[] table; // 存储桶的数组
transient int size; // 键值对数量
int threshold; // 扩容阈值(容量 * 负载因子)
final float loadFactor; // 负载因子(默认 0.75)

HashMap 的哈希计算

HashMap 通过哈希函数将键映射到数组的索引位置。哈希函数的设计目标是尽量均匀分布键值对,减少冲突。

static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

哈希计算分为两步:

  1. 调用键的 hashCode() 方法获取哈希值。
  2. 将哈希值的高 16 位与低 16 位异或,以减少哈希冲突。

HashMap 的 put 方法

put 方法是 HashMap 的核心操作之一,用于插入键值对。

public V put(K key, V value) {return putVal(hash(key), key, value, false, true);
}final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {Node<K,V>[] tab; Node<K,V> p; int n, i;if ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length; // 初始化或扩容if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null); // 桶为空,直接插入else {Node<K,V> e; K k;if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))e = p; // 键已存在else if (p instanceof TreeNode)e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value); // 红黑树插入else {for (int binCount = 0; ; ++binCount) {if ((e = p.next) == null) {p.next = newNode(hash, key, value, null); // 链表插入if (binCount >= TREEIFY_THRESHOLD - 1)treeifyBin(tab, hash); // 链表转红黑树break;}if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))break; // 键已存在p = e;}}if (e != null) { // 更新值V oldValue = e.value;if (!onlyIfAbsent || oldValue == null)e.value = value;return oldValue;}}++modCount;if (++size > threshold)resize(); // 扩容return null;
}

HashMap 的 resize 方法

resize 方法用于初始化或扩容 HashMap 的桶数组。

final Node<K,V>[] resize() {Node<K,V>[] oldTab = table;int oldCap = (oldTab == null) ? 0 : oldTab.length;int oldThr = threshold;int newCap, newThr = 0;if (oldCap > 0) {if (oldCap >= MAXIMUM_CAPACITY) {threshold = Integer.MAX_VALUE;return oldTab;}else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY && oldCap >= DEFAULT_INITIAL_CAPACITY)newThr = oldThr << 1; // 双倍扩容}else if (oldThr > 0)newCap = oldThr; // 初始容量设置为阈值else {newCap = DEFAULT_INITIAL_CAPACITY; // 默认初始容量 16newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY); // 默认阈值 12}if (newThr == 0) {float ft = (float)newCap * loadFactor;newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ? (int)ft : Integer.MAX_VALUE);}threshold = newThr;Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap];table = newTab;if (oldTab != null) {for (int j = 0; j < oldCap; ++j) { // 迁移数据Node<K,V> e;if ((e = oldTab[j]) != null) {oldTab[j] = null;if (e.next == null)newTab[e.hash & (newCap - 1)] = e; // 单个节点直接迁移else if (e instanceof TreeNode)((TreeNode<K,V>)e).split(this, newTab, j, oldCap); // 红黑树迁移else {Node<K,V> loHead = null, loTail = null;Node<K,V> hiHead = null, hiTail = null;Node<K,V> next;do {next = e.next;if ((e.hash & oldCap) == 0) { // 低位链表if (loTail == null)loHead = e;elseloTail.next = e;loTail = e;}else { // 高位链表if (hiTail == null)hiHead = e;elsehiTail.next = e;hiTail = e;}} while ((e = next) != null);if (loTail != null) {loTail.next = null;newTab[j] = loHead;}if (hiTail != null) {hiTail.next = null;newTab[j + oldCap] = hiHead;}}}}}return newTab;
}

HashMap 的 get 方法

get 方法用于根据键获取值。

public V get(Object key) {Node<K,V> e;return (e = getNode(hash(key), key)) == null ? null : e.value;
}final Node<K,V> getNode(int hash, Object key) {Node<K,V>[] tab; Node<K,V> first, e; int n; K k;if ((tab = table) != null && (n = tab.length) > 0 && (first = tab[(n - 1) & hash]) != null) {if (first.hash == hash && ((k = first.key) == key || (key != null && key.equals(k))))return first; // 检查第一个节点if ((e = first.next) != null) {if (first instanceof TreeNode)return ((TreeNode<K,V>)first).getTreeNode(hash, key); // 红黑树查找do {if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))return e; // 链表查找} while ((e = e.next) != null);}}return null;
}

HashMap 的性能优化

HashMap 的性能取决于哈希冲突的频率。以下是一些优化点:

  1. 初始容量和负载因子:根据实际需求设置合理的初始容量和负载因子,减少扩容次数。
  2. 键的哈希码:确保键的 hashCode() 方法分布均匀,减少冲突。
  3. 红黑树:链表长度超过阈值时转换为红黑树,提高查询效率。

HashMap 的线程安全性

HashMap 是非线程安全的。在多线程环境下,可以使用 ConcurrentHashMapCollections.synchronizedMap 实现线程安全。

http://www.dtcms.com/wzjs/446651.html

相关文章:

  • 直播网站开发多少钱百度指数如何分析数据
  • 网站维护服务今日最新的新闻
  • 郑州做网站网站建设费用关键词查询神器
  • 网站套餐 襄阳旭日网站建设品牌推广运营策划方案
  • 坂田网站建设服务项目企业网站营销优缺点
  • 策划网站建设价格品牌推广策划营销策划
  • 网上做效果图网站有哪些网络营销策划书的主要内容
  • wordpress做门户网站百度一下官方网址
  • 太原网站设计合肥百度seo排名
  • 有做赛车网站的吗产品推广语
  • 中国建筑网官方网站入口杭州seo工作室
  • dz做网站无锡网站推广公司
  • 政府网站建设硬件选型原则种子搜索
  • 知名手机网站电商运营入门基础知识
  • 网站首页样式湖北seo公司
  • 2k屏幕的网站怎么做2024年将爆发新瘟疫
  • 大型网站建设的主要问题网络营销的案例有哪些
  • 手机网站制作公司企业网站seo贵不贵
  • 平谷区住房城乡建设委网站app联盟推广平台
  • 网站专业好找工作吗搜索引擎排名优化包括哪些方面
  • 什么作为国内的主要门户网站百度健康
  • 湖北专业网站建设检修微信推广广告在哪里做
  • 建设新闻网站需要注意什么太原模板建站定制网站
  • 网站 流程优化项目平台
  • 网站开发主要技术路线东莞企业网站设计公司
  • wordpress 简码大全网站搜索引擎优化案例
  • 兼职网站建设招聘信息b2b电子商务网站都有哪些
  • 免费做推广的网站有哪些软文撰写
  • 周村网站建设网络营销渠道可分为哪些
  • 旅游网站B2C如何去推广