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,一经查实,立即删除!

相关文章

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…

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;通过现金返还机制为购物赋予了新的定义。这一…

【微服务】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…

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

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

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

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

技术驱动校园招聘:Java+SpringBoot+Vue的实践之旅

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【Vue3】学习命名路由和嵌套路由

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

wsl安装及Anaconda配置

文章目录 wslAnaconda下载安装包安装Anaconda配置环境写在最后 wsl 照着一步一步配置就好 wsl_update链接 Anaconda 下载安装包 找到自己所需的 在终端输入&#xff1a; wget https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh将Anaconda3-2024.02-…

软件测试面试都问了什么?中级软件测试岗面试(4面)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 一面&#xff08;…

Pulsar消息路由深入剖析

一、概述 大数据背景下&#xff0c;分区应该是所有组件必备的基本条件&#xff0c;否则面对海量数据时无论是计算还是存储都容易遇到瓶颈。跟其他消息系统一样&#xff0c;Pulsar通过Topic将消息数据进行业务层面划分管理&#xff0c;同时也支持Topic分区&#xff0c;通过将多…

2024年信息技术与计算机工程国际学术会议(ICITCEI 2024)

2024年信息技术与计算机工程国际学术会议&#xff08;ICITCEI 2024&#xff09; 2024 International Conference on Information Technology and Computer Engineering ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 大会主题&#xff1a; 信息系统和技术…

软件应用实例分享,茶楼计时收费管理系统软件,佳易王茶社吧台计时收费软件试用版教程

软件应用实例分享&#xff0c;茶楼计时收费管理系统软件&#xff0c;佳易王茶社吧台计时收费软件试用版教程 一、前言 以下软件操作教程以 佳易王茶室计时计费软件V17.9为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 【茶楼计时计费软件&…

解决Java项目运行时错误:“Command line is too long”

在开发Java应用的过程中&#xff0c;你可能偶尔会遇到“Error running ‘Application’: Command line is too long”的问题。这是因为Java虚拟机&#xff08;JVM&#xff09;在启动时&#xff0c;如果传递给它的类路径&#xff08;classpath&#xff09;过长&#xff0c;超过了…

基于Java (spring-boot)的人才招聘系统

一、项目介绍 公司&#xff1a; IT公司的注册与管理 招聘要求的发布与维护 站内私信 求职者&#xff1a; 招聘需求浏览 招聘需求筛选&#xff08;按岗位、薪酬、城市、地区等&#xff09; 简历编辑&#xff0c;建立投递等 站内私信 管理员&#xff1a; 用户信息维护 岗…

ChatGPTPLUS、Poe、Claude介绍,以及如何订阅

我使用了FOmepay的556150卡段升级了ChatGPTPLUS、POE、Claude3 一、ChatGPT Plus 是什么&#xff1f; ChatGPT Plus 是基于 ChatGPT 的月订阅升级方案&#xff0c;它可以提供更快的回应速度、更高的可用性以及优先使用到新功能的权限。 ChatGPT Plus 和原版 ChatGPT 的差异 …