人工智能AI 技能文档开发工具【免费下载链接】DocAgent项目地址https://gitcode.com/Cangjie-SIG/DocAgent点击查看免费下载本篇技术指南以仓颉语言标准库std.collection中的哈希表实现HashMapK, V为核心通过官方示例文件 sample_hashmap_get_add_contains.md 讲解其最基本的三个操作——添加键值对add、按键取值get与按键判断contains。读完本文你将掌握HashMap的构造方式、Option返回值语义及其安全取值手段并能直接上手编写可运行的键值对存取代码。HashMap 是什么HashMapK, V是MapK, V接口的哈希表实现位于仓颉标准库的std.collection包中定义见 HashMap_class.md。哈希表是一种常用的数据结构其基本原理是把每个键映射为一个哈希值再用该哈希值确定元素在底层数组中的存储位置从而实现快速查找、插入和删除。由于哈希运算与数组下标访问的时间代价基本恒定哈希表上这三类操作的时间复杂度通常是 O(1)。需要特别注意的是因为哈希表底层的数组大小是动态的插入元素过多时会触发扩容所以HashMap 不能保证元素的顺序不可变。这与 TreeMap基于红黑树、按键有序形成鲜明对比在 collection_package_overview.md 中有明确说明。此外std.collection提供的集合类型都不支持并发安全。HashMapK, V的类声明对键类型有约束K : Hashable EquatableK即键必须可哈希且可判等这是哈希表正确寻址的前提。类本身实现MapK, V接口并扩展了EquatableHashMapK, V支持/!与ToString支持toString()接口。示例get/add/contains 的基本用法仓库中的官方示例 sample_hashmap_get_add_contains.md 完整演示了三个核心函数代码如下import std.collection.* main() { var map: HashMapString, Int64 HashMapString, Int64() map.add(a, 99) // map : [(a, 99)] map.add(b, 100) // map : [(a, 99), (b, 100)] var a map.get(a) var bool map.contains(a) print(a${a.getOrThrow()} ) print(bool${bool.toString()}) return 0 }运行结果a99 booltrue这段代码虽短却覆盖了HashMap最典型的使用流程先构造空映射再连续add两个键值对随后用get取出指定键的值用contains判断键是否存在。下面逐一拆解每个环节。构造HashMapString, Int64()示例通过HashMapString, Int64()构造一个键为String、值为Int64的空哈希表。HashMap共提供 5 个构造函数详见 collection_package_class.md构造函数原型说明默认构造init()默认初始容量为 16键值对数组init(elements: Array(K, V))根据数组 size 设置容量重复键按迭代器顺序后者覆盖前者键值对集合init(elements: Collection(K, V))根据集合 size 设置容量重复键处理同上指定容量init(capacity: Int64)容量小于 0 时抛IllegalArgumentException个数规则函数init(size: Int64, initElement: (Int64) - (K, V))由规则函数生成键值对size 小于 0 时抛IllegalArgumentException对于元素个数可预估的场景推荐使用init(capacity)预分配容量避免插入过程中反复扩容带来的性能开销。add将键值对放入 HashMappublic func add(key: K, value: V): OptionVadd用于把键值对放入HashMap。其关键语义是覆盖策略对于映射中已有的键该键对应的值将被新值替换同时返回旧值对于新键则直接添加返回OptionV.None。返回值用Option封装正好让调用方区分本次是新增还是覆盖。示例中两次调用map.add(a, 99) // map : [(a, 99)] map.add(b, 100) // map : [(a, 99), (b, 100)]执行后映射包含两个键值对。由于Map不允许重复键每个键最多映射到一个值见 Map_interface.md因此若再次map.add(a, 200)a的值会被更新为 200且返回Some(99)。除单个键值对形式外add还有一个批量重载add(all!: Collection(K, V)): Unit可按集合迭代器顺序批量放入同样遵循已有键被新值替换的规则相关完整示例见 sample_hashmap_add_remove_clear.md。运算符糖map[key] valueHashMap对add做了运算符重载public operator func [](key: K, value!: V): Unit。当键存在时新值覆盖旧值键不存在时添加键值对。因此map[a] 99与map.add(a, 99)效果一致日常编码中可以按习惯选用。get按键取值的正确姿势public func get(key: K): ?Vget返回指定键映射到的值返回值类型为OptionV语法上写作?V如果映射中存在该键返回Some(value)如果不存在返回OptionV.None。这一设计避免了取不存在的键时抛异常或返回空指针的尴尬把可能没有值这一信息显式地编码进类型系统。示例中var a map.get(a) print(a${a.getOrThrow()} )map.get(a)得到OptionInt64随后调用a.getOrThrow()取出原始Int64值。getOrThrow是Option提供的安全取值方法定义在 core_package_enums.mdgetOrThrow(): T当实例为SomeT时返回其中值若为None则抛出NoneValueExceptiongetOrThrow(exception: () - Exception): T当实例为None时执行传入的异常函数并抛出其返回的异常适合在键缺失时需要自定义错误信息如配置项不存在的场景。因此getgetOrThrow的组合适合键必然存在的业务假设如果键可能缺失更稳妥的做法是先contains判断或利用Option的match分支分别处理Some与NoneHashMap的迭代遍历即采用该模式参见 sample_hashmap_add_remove_clear.md 中的批量添加示例。get同样有运算符重载public operator func [](key: K): V即map[a]直接返回键对应的值。注意该重载在键不存在时会抛NoneValueException见 collection_package_class.md所以[]取值的健壮性不如get 判空使用前需自行保证键存在。contains判断键是否存在public func contains(key: K): Boolcontains用于判断映射中是否存在指定键的映射存在返回true否则返回false。示例中var bool map.contains(a) print(bool${bool.toString()})因为此前已add(a, 99)所以输出booltrue。contains是典型的先判断再取组合的搭档在键可能缺失的场景下先contains确认再安全地取值或走其他逻辑分支。contains还有一个批量重载contains(all!: CollectionK): Bool用于判断是否包含集合中所有键的映射全部包含才返回true。一个完整的增查删清演示为加深对HashMap语义的理解仓库还提供了配套示例 sample_hashmap_add_remove_clear.md演示批量添加、删除与清空import std.collection.* main() { var map: HashMapString, Int64 HashMapString, Int64() var arr: Array(String, Int64) [(d, 11), (e, 12)] map.add(a, 13) print(a${map.get(a).getOrThrow()} ) map.add(all: arr) // map : [(d, 11), (e, 12)] var d map.get(d) print(d${d.getOrThrow()} ) map.remove(d) // map : [(e, 12)] var bool map.contains(d) print(bool${bool.toString()} ) map.clear() // map: [] var bool1 map.contains(e) print(bool1${bool1.toString()}) return 0 }运行结果a13 d11 boolfalse bool1false其中remove(d)删除指定键的映射并返回被删值键不存在时返回Noneclear()清空所有键值对。可以看到删除与清空之后contains的判定随之变为false三个函数配合即可完成映射的完整生命周期管理。更多成员函数速览除add/get/contains外HashMap还提供一系列常用成员完整 API 见 HashMap_class.md 与 collection_package_class.md函数原型说明size/capacityprop分别返回键值对个数与容量addIfAbsent(key: K, value: V): ?V键不存在才添加否则不做修改并返回旧值remove(key: K): OptionV删除指定键的映射返回被删值或NoneremoveIf(predicate: (K, V) - Bool): Unit遍历删除满足条件的键值对predicate 内修改映射会抛ConcurrentModificationExceptionreplace(key: K, value: V): ?V键已存在则更新值并返回旧值否则不做修改reserve(additional: Int64): Unit扩容剩余容量不足时按容量 1.5 倍规则扩容keys/values()返回所有键/值的容器视图iterator()返回HashMapIteratorK, V用于遍历entryView(key: K): MapEntryViewK, V获取指定键的引用视图clone/toArray/isEmpty()克隆、转数组、判空小结HashMap是仓颉标准库std.collection中面向键值映射 快速查找场景的首选容器用add或map[k] v写入用get加getOrThrow或map[k]读取用contains判存。其Option化的返回值让缺失键成为可显式处理的常态分支而非运行时异常。掌握这三个基本函数后再结合批量add、remove、clear与迭代遍历即可应对大多数映射类业务需求。相关示例与 API 文档均可从 std/collection 目录下继续查阅。赞分享人工智能AI 技能文档开发工具【免费下载链接】DocAgent项目地址https://gitcode.com/Cangjie-SIG/DocAgent点击查看免费下载相关推荐仓颉标准库 HashMap 键值操作实战get/add/contains 用法与哈希表源码原理仓颉标准库 HashMap 键值操作实战get/add/contains 用法与哈希表源码原理 本文以仓颉Cangjie标准库 std.collectio编程语言语言运行时标准库垃圾回收并发编程仓颉编程语言 HashMap 入门实战get/add/contains 函数的使用与原理解析仓颉编程语言 HashMap 入门实战get/add/contains 函数的使用与原理解析 仓颉标准库 std.collection 包中的 HashMap文档知识库教程OpenHarmony仓颉标准库 std.collection 实战HashMap 的 add / remove / clear 增删改清操作详解仓颉标准库 std.collection 实战HashMap 的 add / remove / clear 增删改清操作详解 导读 本文以 sample_ha人工智能AI 技能文档开发工具上一篇如何快速部署 Manga Translator UI Web 服务器账号、配额与多用户权限完整指南下一篇HowToCook 地三鲜完整实战指南分阶段过油与酱汁挂汁的参数化复刻创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考