Map查找表

本文详细介绍了 Java 中 Map 接口的基本概念及其主要实现类 HashMap 和 TreeMap 的特性。此外,还介绍了 LinkedHashMap 的特点以及 Map 的核心方法如 put、get 和 remove 的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Map:是一个接口,其定义的集合又称查找表,用于存储“key-value”映射对。key可以看成是value的索引。

          作为key的对象在集合中不能重复,即:在一个Map中不能有2个equals()比较结果为true的key。

          Map集合看起来像一个多行2列的表格,常用的2个实现类为:hash表(HashMap)和二叉树表(TreeMap)

          LinkedHashMap:维护着一个双向循环链表,通常迭代顺序为存放顺序。可实现有序Map。


int  size():获取“key-value”对的个数,而不是元素总个数


Mapzhong中String  tostring()的返回形式为:{key1 = value1,key2 = value2,...}


V  put(K  key,V  value):向Map中存放元素

若key在Map中不存在,会将给定的key与value存入Map中,返回值为null

若key在Map中存在,添加新的value,则是替换原有的value,返回被替换的value

这里我们应该注意:若value是一个包装类,我们获取put返回值时,应当使用相对应的包装类去接收value,而不应该使用基本类型。因为会涉及到隐式的自动拆箱,可能引发空指针异常。


V get(K  key):获取Map中给定的key对应的value并返回,若key在Map中不存在则返回null


V  remove(K  key):根据给定的key删除“key-value”对元素,并返回key所对应的value。若key不存在则返回null。


boolean containsKey(K  key):查看当前Map中是否包含给定的key


Map提供了三种遍历方式:

(1)遍历所有的key

Set<K>  keySet():将当前Map中所有的key存入一个Set集合中,并返回集合。我们只需遍历该集合即可。

(2)遍历每一个键值对

Set< Entry<K><V> >   entrySet()

将当前Map中每一组key-value对封装为一个Entry对象并存入一个Set集合中,并返回。

该方法获取一个Set集合,该集合中存放若干个Entry实例,每个实例内部都包含两个属性,分别保存key、value。

这样我们遍历每一个Entry实例就相当于遍历了每一个键值对。

(3)遍历所有的value(不常用)

Collection  values():将所有的value放入一个集合中,并返回。

不能放入Set集合,因为value允许重复。


使用HashMap的注意事项:

(1)我们应当尽量保证不相同的key,hashCode值也不应该相同,否则将大大降低hashCode()的检索效果

(2)若两个对象equals()结果为true,那么两个对象的hashCode值也一定相等。

(3)若两个对象equals()结果为false,我们也应尽量保证它们的hashCode值不相同

(4)当key-value的属性没有改变的情况下,hsahCode的值应当是一个稳定值

(5)一般我们在重写equals()也必须重写hashCode()


装载因子及HashMap的优化:

Capacity:容量,即散列数组的大小

Initial capacity:初始容量,默认为16

Size:当前散列表中存储数据的对数

Load factor:加载因子,Size/capacity的值,默认为0.75,用于判断是否扩容和rehash。可减少资源浪费,和提高性能。


### 关于 Map 数据结构的查找效率 Map 是一种常见的数据结构,用于存储键值对(key-value pairs)。它的主要功能之一是通过给定的键快速找到对应的值。关于 Map 的查找效率,可以从以下几个方面进行分析: #### 1. **查找时间复杂度** Map 的查找时间复杂度通常为 \(O(1)\)[^3],这意味着无论 Map 中有多少个键值对,查找操作所需的平均时间都是常数级别的。这种高效的查找能力得益于底层实现机制。 - 如果 Map 使用哈希作为底层实现(如 Java 中的 `HashMap`),那么查找过程依赖于哈希函数将键映射到特定的位置。理想情况下,哈希函数能够均匀分布键值对,从而减少冲突的发生。 - 当发生哈希冲突时(即多个键被映射到了同一个位置),通常会使用链地址法或其他解决方法来处理这些冲突。此时,最坏情况下的查找时间复杂度可能会退化为 \(O(n)\),但这取决于具体的设计以及实际输入数据的特点[^2]。 #### 2. **影响查找效率的因素** 尽管理论上 Map 提供了接近恒定时间的查找性能,但在实践中仍有一些因素会影响其效率: - **负载因子**:这是衡量哈希填充程度的一个指标。较高的负载因子可能导致更多的碰撞,进而降低查找速度。为了保持良好的性能,许多编程语言会在达到一定阈值时自动调整内部容量大小。 - **哈希函数的质量**:一个好的哈希函数应该能尽量避免不同关键字产生相同的散列码,这样可以有效控制桶内元素数量,提升访问速率[^4]。 - **键类型的特性**:某些类型的对象可能更难设计出优秀的哈希算法或者比较逻辑,这同样会对整体现造成负面影响。 #### 3. **空间换时间的思想体现** 正如前面提到过的小明案例那样,当单纯依靠循环迭代无法满足需求时,则可以通过引入额外的数据容器比如 Map 来换取更快的操作响应。虽然这样做增加了内存消耗\(O(n)\)[^3],但却极大地提高了检索的速度至几乎即时完成的程度。 ```java // 示例代码展示如何利用 HashMap 实现高效查询 import java.util.HashMap; public class Example { public static void main(String[] args){ HashMap<Integer, String> map = new HashMap<>(); // 插入若干条记录... map.put(1,"Apple"); map.put(2,"Banana"); long startTime = System.nanoTime(); boolean found = map.containsKey(2); long endTime = System.nanoTime(); System.out.println("Lookup took "+ (endTime-startTime)+ " nanoseconds."); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值