Map接口

Map接口

Map接口,双列集合(每个元素,包含一个键(key),一个值对象(Value),键与值之间的对应关系叫做映射),Map中每个元素的键不允许重复,访问时只要指定键,就可以找到对应的值

Map中特有的方法有:

  • put(K key, V value): 向map中添加一个映射关系,如果key已存在,则更新其对应的value
  • putAll(Map<? extends K,? extends V> m): 将指定map中的所有映射关系复制到当前map中
  • remove(Object key): 根据指定的key删除对应的映射关系
  • containsKey(Object key): 判断map中是否包含指定的key
  • containsValue(Object value): 判断map中是否包含指定的value
  • get(Object key): 根据指定的key获取对应的value,如果key不存在,则返回null
  • isEmpty(): 判断map是否为空
  • size(): 获取map中映射关系的数量
  • values(): 返回map中所有value的集合
  • keySet(): 返回map中所有key的集合

代码:

	import java.util.Map;
import java.util.HashMap;public class MapExample {public static void main(String[] args) {// 创建一个HashMap实例Map<String, Integer> map = new HashMap<>();// put方法 - 添加或更新键值对map.put("one", 1);map.put("two", 2);map.put("three", 3);// get方法 - 根据键获取值Integer value = map.get("two");System.out.println("Value for 'two': " + value);// remove方法 - 根据键删除键值对map.remove("two");System.out.println("Map after removing 'two': " + map);// containsKey方法 - 检查map中是否包含某个键boolean hasOne = map.containsKey("one");System.out.println("Does map contain 'one'? " + hasOne);// containsValue方法 - 检查map中是否包含某个值boolean hasValueTwo = map.containsValue(2);System.out.println("Does map contain value 2? " + hasValueTwo);// isEmpty方法 - 检查map是否为空boolean isEmpty = map.isEmpty();System.out.println("Is map empty? " + isEmpty);// size方法 - 获取map中键值对的数量int size = map.size();System.out.println("Size of map: " + size);// keySet方法 - 返回map中所有键的集合for (String key : map.keySet()) {System.out.println("Key: " + key + ", Value: " + map.get(key));}// values方法 - 返回map中所有值的集合for (Integer value : map.values()) {System.out.println("Value: " + value);}// putAll方法 - 将另一个map的所有映射复制到当前mapMap<String, Integer> anotherMap = new HashMap<>();anotherMap.put("four", 4);anotherMap.put("five", 5);map.putAll(anotherMap);System.out.println("Map after putAll: " + map);}
}

HashMap实现类

HashMap是Map接口的一个实现类,HashMap集合用于存储键值映射的关系,其中没有重复的键,元素无序(其大部分方法都来源于Map接口)

HashMap的底层逻辑:

  • 数组+链表(或红黑树):内部使用一个数组来存储键值对。每个数组元素是一个桶(bucket),桶中可能包含一个链表(或红黑树),用于存储具有相同哈希值的键值对。当哈希冲突发生时(即多个键具有相同的哈希值),它们会被放在同一个桶的链表中

  • 哈希函数:使用哈希函数来计算键的哈希值。哈希函数的目标是将键均匀分布在数组的各个位置,以便减少冲突和查找时间。哈希函数的选择对于的性能至关重要

  • 哈希冲突解决:当哈希冲突发生时,采用链地址法(chaining)来解决。即,所有具有相同哈希值的键值对被放入同一个桶的链表中。如果链表过长(默认阈值为8),会将其转换为红黑树,以提高搜索效率

  • 扩容:当中的元素数量超过数组大小的一定比例(加载因子,默认为0.75)时,会进行扩容。扩容时,它会创建一个新的更大的数组,并将原有数组中的元素重新计算哈希值并放入新数组中。扩容是一个相对耗时的操作,因此在初始化时可以指定一个合适的初始容量和加载因子,以减少扩容次数

以下是部分底层代码:

public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {// 默认初始容量和加载因子static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16static final float DEFAULT_LOAD_FACTOR = 0.75f;// Node类,用于存储键值对static class Node<K,V> implements Map.Entry<K,V> {final int hash;final K key;V value;Node<K,V> left;Node<K,V> right;Node(int hash, K key, V value, Node<K,V> left, Node<K,V> right) {this.hash = hash;this.key = key;this.value = value;this.left = left;this.right = right;}// ... 其他方法 ...}// 用于存储桶的数组transient Node<K,V>[] table;// 用于快速失败的迭代器transient Iterator<Map.Entry<K,V>> iterator;// 其他字段和方法...// 计算键的哈希值,并根据哈希值确定其应该放在数组中的索引final int indexFor(int h, int length) {return h & (length-1);}// 添加或更新键值对public V put(K key, V value) {return putVal(hash(key), key, value, false, true);}// 根据键获取值public V get(Object key) {Node<K,V> e;return (e = getNode(hash(key), key)) == null ? null : e.value;}// 删除键值对public V remove(Object key) {Node<K,V> e;return (e = removeNode(hash(key), key, null, false, true)) == null ?null : e.value;}// 其他方法,如扩容、调整大小、计算哈希值等...
}

TreeMap实现类

TreeMap是 Java 中Map 接口的一个实现类,它使用红黑树(Red-Black tree)作为底层数据结构来存储键值对。TreeMap的特点是元素按键的自然顺序或者构造器传入的 Comparator指定的顺序进行排序。因此,TreeMap 不允许使用null 作为键,因为 null没有自然顺序,且无法与 Comparator比较

TreeMap实现了 NavigableMap接口,这意味着它支持一系列导航方法,这些方法允许程序员以某种顺序遍历键集、值集或键值对集

下面简单概述 TreeMap的一些主要特性和方法:

主要特性

  1. 排序TreeMap 中的元素按键进行排序。如果没有提供比较器Comparator(),则使用键的自然顺序
  2. 不允许 null:因为null没有排序依据
  3. 效率:由于底层使用红黑树,TreeMap的插入、删除和查找操作的平均时间复杂度都是 O(log n)。
  4. 线程不安全HashMapTreeMap与 类似,TreeMap 也不是线程安全的。在多线程环境下使用需要额外的同步措施

主要方法

  • put(K key, V value): 向TreeMap 中插入或更新一个键值对。
  • get(Object key): 根据键获取对应的值。
  • remove(Object key): 删除指定的键值对。
  • firstKey(): 返回当前映射中的第一个(最小)键。
  • lastKey(): 返回当前映射中的最后一个(最大)键。
  • subMap(fromKey, toKey): 返回此映射部分的视图,其键的范围从 (包含)到 (不包含)。fromKeytoKey
  • headMap(toKey): 返回此映射部分的视图,toKey其键小于
  • tailMap(fromKey): 返回此映射部分的视图, fromKey其键大于或等于

示例

import java.util.TreeMap;public class TreeMapExample {public static void main(String[] args) {TreeMap<String, Integer> treeMap = new TreeMap<>();// 添加元素treeMap.put("apple", 1);treeMap.put("banana", 2);treeMap.put("cherry", 3);// 输出映射System.out.println(treeMap); // {apple=1, banana=2, cherry=3}// 获取第一个和最后一个键System.out.println("First Key: " + treeMap.firstKey()); // appleSystem.out.println("Last Key: " + treeMap.lastKey()); // cherry// 遍历键for (String key : treeMap.keySet()) {System.out.println("Key: " + key + ", Value: " + treeMap.get(key));}// 使用子映射TreeMap<String, Integer> subMap = treeMap.subMap("apple", "cherry");System.out.println("SubMap: " + subMap); // {apple=1, banana=2}// 移除元素treeMap.remove("banana");System.out.println("After removal: " + treeMap); // {apple=1, cherry=3}}}
在这个例子中,我们创建了一个TreeMap 并添加了一些元素,然后我们展示了如何获取第一个和最后一个键,如何遍历键,以及如何获取一个子映射;最后,我们展示了如何删除一个键值对

HashTable实现类 

HashTable与HashMap类十分相似,区别是前者是线程安全的,但HashTable存取元素缓慢,基本上已经被HashMap取代,重要的是,HashTable有一个子类在实际应用中使用广泛,其为Properties其主要用于储存字符串类型的键和值,在实际开发中经常使用Properties存储置顶项

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决使用torch.cuda.empty_cache()仍然GPU显存无法释放的问题

在开发的过程中&#xff0c;程序已经关闭&#xff0c;但是GPU显存无法释放&#xff0c;在使用pytorch写程序的时候, 有时候会在控制台终止掉正在运行的程序&#xff0c;但是有时候程序已经结束了&#xff0c;nvidia-smi也看到没有程序了&#xff0c;但是GPU的内存并没有释放&a…

记录一次大厂面试题

回流和重绘 浏览器渲染页面步骤&#xff1a; 处理HTML标记并构建DOM树处理css标记并构建CSSOM树将DOM和CSSOM合并成一个渲染树根据渲染树来布局以计算每个节点的几何信息将各个节点绘制到屏幕上 回流&#xff1a;当Render树中部分或全部元素的尺寸、布局、隐藏等改变&#xf…

C++知识点总结(24):栈的真题

概览 P1044 ★★★☆☆ [NOIP2003 普及组] 栈1. 审题题目背景题目描述输入格式输出格式样例1 2. 思路3. 参考答案3.1 卡特兰公式3.2 前缀和 P1044 ★★★☆☆ [NOIP2003 普及组] 栈 1. 审题 题目背景 栈是计算机中经典的数据结构&#xff0c;简单的说&#xff0c;栈就是限制…

算法:数据结构顺序表表的插入、删除和查找

#include <iostream> #include <stdio.h> #define MaxSize 50 typedef int ElemType; typedef struct {ElemType data[MaxSize];int length; }SqList; bool ListInsert(SqList &L,int i,ElemType e)//插入数据 {if(i<1 || i>L.length1)//判断插入的位置是…

自动化运维利器Ansible基础(环境部署)

Ansible 介绍及安装 1. 介绍 Ansible 是⼀个 IT ⾃动化⼯具。它能配置系统、部署软件、编 排更复杂的 IT 任务&#xff0c;如连续部署或零停机时间滚动更新。 Ansible ⽤ Python 编写&#xff0c;尽管市⾯上已经有很多可供选择的 配置管理解决⽅案&#xff08;例如 Salt、Pupp…

Aigtek高压功率放大器设计参数有哪些

高压功率放大器是一种用于放大高频信号的电子设备&#xff0c;广泛应用于通信、雷达、无线电等领域。它能够将输入信号的幅度放大到较高的水平&#xff0c;以便传输或驱动其他设备。 在设计高压功率放大器时&#xff0c;需要考虑以下几个重要参数&#xff1a; 频率范围&#xf…

代码随想录 二叉树—二叉树的层序遍历Ⅱ

思路&#xff1a;就是在上一个题的基础上将result最后翻转了一下&#xff0c;这样就可以实现自下而上的层序遍历。 知识点&#xff1a;stack和queue&#xff0c;也就是栈和队列&#xff0c;是push&#xff1b; 栈stack&#xff1a;push()&#xff0c;pop()&#xff0c;top()&a…

ELK 安装部署

文章目录 1.日志收集规划2.Elasticsearch部署2.1.Elasticsearch安装2.2.Elasticsearch-head安装2.3.Elasticsearch设置分片数2.4.elasticsearch健康检查 3.Kibana部署4.Logstash部署5.Filebeat部署 开源中间件 # Elastic Stackhttps://iothub.org.cn/docs/middleware/ https:/…

工会排队模式:引领创新消费体验的新潮流

在互联网和电子商务的浪潮下&#xff0c;消费者的购物需求与期待正在持续升级。为了迎合这一趋势&#xff0c;工会排队模式应运而生&#xff0c;以其独特的消费体验方式引领市场潮流。 工会排队模式打破了传统电商的桎梏&#xff0c;通过现金返还机制为购物赋予了新的定义。这一…

vue中表单数据规则验证

1、使用:rules属性&#xff0c;如后h5代码 <template> <div class"dialog-box"> <el-scrollbar> <el-form ref"service" :model"serviceForm" :rules"rules" label-width"100px" > <el-row styl…

【微服务】SpringBoot整合Resilience4j使用详解

目录 一、前言 二、熔断器出现背景 2.1 几个核心概念 2.1.1 熔断 2.1.2 限流 2.1.3 降级 2.2 为什么会出现熔断器 2.3 断路器介绍 2.3.1 断路器原理 三、Resilience4j介绍 3.1 Resilience4j概述 3.1.1 Resilience4j是什么 3.1.2 Resilience4j功能特性 3.2 Resilie…

Windows系统安装OpenSSH结合VS Code远程ssh连接Ubuntu【内网穿透】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-mEkKUraSFHLKkzIj {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

nacos配置更新错误并不会导致已经启动的服务宕机

nacos配置更新错误并不会导致已经启动的服务宕机 但是可能会导致异常

QML GridView 网格视图

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 和 ListView 一样,GridView 也是基于 Flickable 的视图组件,它们的用法非常相似。不同的是,ListView 中的元素被存储在线性链表中,并以单列(或单行)的形式进行展示的,因此适用于垂直(或水平)列表的…

生成哈夫曼树(100%用例)C卷(JavaPythonC++Node.jsC语言)

给定长度为n的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于1。请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。 为了保证输出的二又树中序遍历结果统一,增加以下限制:二叉树节点中,左节点权值小于等于右…

使用Visual Studio创建跨平台CMake项目

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 创建跨平台项目的意义是什么&#xff1f; 跨平台CMake项目的意义在于提供一种统一的构建系统&#xff0c;使得开发者可以编写一份…

第十三届蓝桥杯省赛C++ C组《全题目+题解》

填空题一般都是找规律题目&#xff0c;耐下心来慢慢分析即可。 第一题《排列字母》 【问题描述】 小蓝要把一个字符串中的字母按其在字母表中的顺序排列。 例如&#xff0c;LANQIAO 排列后为AAILNOQ。 又如&#xff0c;GOODGOODSTUDYDAYDAYUP 排列后为AADDDDDGGOOOOPSTUUYYY。…

CommandInvokationFailure: Failed to update Android SDK package list. 报错的解决方法

将Unity升级到2021.3.36f1&#xff0c; 再次打开项目&#xff0c;结果出现“CommandInvokationFailure: Failed to update Android SDK package list. ”这样的警告&#xff0c;查看SDK版本最高只有到30&#xff0c;这应该就是Unity自动升级SDK的时候出现了错误&#xff0c;导致…

简单易集成的实名认证实名认证接口-C#语言实名认证接口免费教程

现如今&#xff0c;随着网络安全法等相关法规的实施&#xff0c;线上互联网平台与服务提供商都要求用户进行实名认证&#xff0c;以提高账户安全、防止欺诈行为和保障交易的合法性。翔云实名认证接口&#xff0c;通过核验身份证二要素、三要素、三要素现场人像的方式助力线上平…

十五、软考-系统架构设计师笔记-面向服务架构设计理论与实践

1、SOA相关概念 面向服务的架构(SOA)的定义 SOA 是一个组件模型&#xff0c;它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的&#xff0c;它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构…