集合框架(3)Map

Map接口

现实生活与开发中,我们常会看到这样的一类集合:用户ID与账户信息、学生姓名与考试成绩、IP地址与主机名等,这种一一对应的关系,就称作映射。Java提供了专门的集合框架用来存储这种映射关系的对象,即java.util.Map接口。

1、 Map接口概述

  • Map与Collection并列存在。Map用于保存具有映射关系的数据:key-value
    • Collection集合称为单列集合,元素是孤立存在的(理解为单身)。
    • Map集合称为双列集合,元素是成对存在的(理解为夫妻)。
  • Map 中的 key 和 value 都可以是任何引用类型的数据。但常用String类作为Map的“键”(key)。
  • Map接口的常用实现类:HashMapLinkedHashMapTreeMapProperties。其中,HashMap是 Map 接口使用频率最高的实现类

1.1 Map中key-value特点

这里主要以HashMap为例说明。HashMap中存储的key、value的特点如下:

  • Map 中的 key以哈希值排列无序、不允许重复所有的key构成一个Set集合,即key所在的类,须重写hashCode()和equals()方法
  • Map中的value与key一一对应,无序、允许重复。所有的value构成一个Collection集合,即value所在的类需要重新equals()方法。
  • key与value一一对应,就构成了一个个entry,所有的entry构成了一个Set集合
  • key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value,不同key对应的value可以重复。value所在的类要重写equals()方法。
  • key和value构成一个entry。所有的entry彼此之间是无序的不可重复的
1.2  Map接口的常用方法
  • 添加、修改操作:
    • Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
    • void putAll(Map m):将m中的所有key-value对存放到当前map中
  • 删除操作:
    • Object remove(Object key):移除指定key的key-value对,并返回value
    • void clear():清空当前map中的所有数据
@Test
public void test1(){HashMap hashMap = new HashMap();hashMap.put("Dit",9999);hashMap.put("Qum",18);hashMap.put("99",99);hashMap.put(new Person("Flank",24),"disguise");System.out.println(hashMap);hashMap.remove("99");//移除指定的key-value对System.out.println(hashMap);Object oldVlue = hashMap.put("Qum",20);//因为key值已经存在,所以此处的put方法用于替换已经存在的value值,此时返回Object类的value值,进行接收。System.out.println(oldVlue);//18System.out.println(hashMap);
}
  • 元素查询的操作:
    • Object get(Object key):获取指定key对应的value
    • boolean containsKey(Object key):是否包含指定的key
    • boolean containsValue(Object value):是否包含指定的value
    • int size():返回map中key-value对的个数
    • boolean isEmpty():判断当前map是否为空
    • boolean equals(Object obj):判断当前map和参数对象obj是否相等
  • 元视图操作的方法:
    • Set keySet():返回所有key构成的Set集合
    • Collection values():返回所有value构成的Collection集合
    • Set entrySet():返回所有key-value对构成的Set集合

Map的主要实现类:HashMap

1HashMap概述

  • HashMap是 Map 接口使用频率最高的实现类。
  • HashMap是线程不安全的。允许添加 null 键和 null 值。
  • 存储数据采用的哈希表结构,底层使用一维数组+单向链表+红黑树进行key-value数据的存储。与HashSet一样,元素的存取顺序不能保证一致。
  • HashMap 判断两个key相等的标准是:两个 key 的hashCode值相等,通过 equals() 方法返回 true。
  • HashMap 判断两个value相等的标准是:两个 value 通过 equals() 方法返回 true。

@Test
public void test1(){
    Map map = new HashMap();//HashMap中,key键和value值都可以输入成null

    map.put(null,null);
    System.out.println(map);
}

HashMap集合的遍历方法:

(1) 调用keySet(),建立Set集合,使用迭代器/foreach循环。

Set keySet = hashMap.keySet();//调用hashMap的keySet方法,建立Set集合。
Iterator iterator = keySet.iterator();//利用Set集合的iterator迭代器进行遍历。
while (iterator.hasNext()){System.out.println(iterator.next());
}

(2)调用values(),建立Colletion集合,使用迭代器/foreach循环。

//调用hashMap的values方法,建立Collection集合。
Collection values = hashMap.values();
//使用foreach循环,输出values集合的对象值。
for (Object obj : values){System.out.println(obj);
}

(3)调用entrySet(),建立Set集合,使用迭代器(需要通过Map接口使用entry接口,写作Map.entry)/foreach循环

//调用entrySet方法,建议Set集合,调用迭代器进行遍历。
Set entrySet = hashMap.entrySet();
Iterator iterator = entrySet.iterator();
while (iterator.hasNext()){Map.Entry entry = (Map.Entry) iterator.next();//因为Entry是Map的内部接口,必须通过Map进行调用。//又因为iterator的返回值是Object类,要想使用entry接口中的方法,必须进行强转。System.out.println(entry.getKey()+"-----"+entry.getValue());//调用实现Map.Entry的entry实例中的getkey与getvalue方法
}

2 Map实现类之二:LinkedHashMap

  • LinkedHashMap 是 HashMap 的子类
  • 存储数据采用的哈希表结构+链表结构,在HashMap存储结构的基础上,使用了一对双向链表记录添加元素的先后顺序,可以保证遍历元素时,与添加的顺序一致。
  • 通过哈希表结构可以保证键的唯一、不重复,需要键所在类重写hashCode()方法、equals()方法。
  • 频繁遍历时可以选择使用LinkedHashMap

3Map实现类之三:TreeMap

  • TreeMap存储 key-value 对时,需要根据 key-value 对进行排序。TreeMap 可以保证所有的 key-value 对处于有序状态
  • TreeSet底层使用红黑树结构存储数据
  • TreeMap 的 Key 的排序:
    • 自然排序:TreeMap 的所有的 Key 必须实现 Comparable 接口,而且所有的 Key 应该是同一个类的对象,否则将会抛出 ClasssCastException
@Test
public void test1(){TreeMap map = new TreeMap();map.put("QQ","adorable");map.put("hj","silly");map.put("hihi","yeye");map.put("haha","with you");//key必须是同一个类,value可以不同类。//如果key不同类,则报ClassCastExceptionSet entrySet = map.entrySet();for (Object obj:entrySet){System.out.println(obj);}
}
    • 定制排序:创建 TreeMap 时,构造器传入一个 Comparator 对象,该对象负责对 TreeMap 中的所有 key 进行排序。此时不需要 Map 的 Key 实现 Comparable 接口
  • TreeMap判断两个key相等的标准:两个key通过compareTo()方法或者compare()方法返回0。TreeMap中不再依赖于HashMap()与equals()方法检验key键的相等。
@Test
public void test2(){Comparator comparator = new Comparator() {@Overridepublic int compare(Object o1, Object o2) {if (o1 instanceof Person && o2 instanceof Person){Person P1 = (Person) o1;Person P2 = (Person) o2;int value = P1.getName().compareTo(P2.getName());if (value!=0){return value;}return P1.getAge()- P2.getAge();}throw new RuntimeException("类型不匹配");}};Person p1 = new Person("Qum",18);Person p2 = new Person("Dit",1024);TreeMap treeMap = new TreeMap(comparator);treeMap.put(p1,"miss");treeMap.put(p2,"alone");Set entrySet = treeMap.entrySet();Iterator iterator = entrySet.iterator();while (iterator.hasNext()){Map.Entry entry = (Map.Entry) iterator.next();System.out.println(entry.getKey()+"----"+entry.getValue());}
}

4Map实现类之四:Hashtable

  • Hashtable是Map接口的古老实现类,JDK1.0就提供了。不同于HashMap,Hashtable是线程安全的。
  • Hashtable实现原理和HashMap相同,功能相同。底层都使用哈希表结构(数组+单向链表),查询速度快。
  • 与HashMap一样,Hashtable 也不能保证其中 Key-Value 对的顺序
  • Hashtable判断两个key相等、两个value相等的标准,与HashMap一致。
  • 与HashMap不同,Hashtable 不允许使用 null 作为 key 或 value。

面试题:Hashtable和HashMap的区别

HashMap:底层是一个哈希表(jdk7:数组+链表;jdk8:数组+链表+红黑树),是一个线程不安全的集合,执行效率高
Hashtable:底层也是一个哈希表(数组+链表),是一个线程安全的集合,执行效率低

HashMap集合:可以存储null的键、null的值
Hashtable集合:不能存储null的键、null的值

Hashtable和Vector集合一样,在jdk1.2版本之后被更先进的集合(HashMap,ArrayList)取代了。所以HashMap是Map的主要实现类,Hashtable是Map的古老实现类。

Hashtable的子类Properties(配置文件)依然活跃在历史舞台
Properties集合是一个唯一和IO流相结合的集合

5Map实现类之五:Properties

  • Properties 类是 Hashtable 的子类,该对象用于处理属性文件
  • 由于属性文件里的 key、value 都是字符串类型,所以 Properties 中要求 key 和 value 都是字符串类型
name=Qum
password=withDit

file中的keyvalue,一般不加入空格,因为无法区分空格是否属于字符串。

  • 存取数据时,建议使用setProperty(String key,String value)方法和getProperty(String key)方法
@Test
public void test1()throws FileNotFoundException, IOException {File file = new File("info.properties");//System.out.println(file.getAbsolutePath());,寻找路径,在相应的module建立fileFileInputStream fls = new FileInputStream(file);//创建流,需要关闭资源Properties pros = new Properties();pros.load(fls);//加载文件中的数据String name = pros.getProperty("name");String password = pros.getProperty("password");System.out.println(name+password);fls.close();
}

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

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

相关文章

力扣--199.二叉树的右视图

题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 提示: 二叉树的节点个数的范围是 [0,100] -100 < Node.val < 100 代码 class Solution { public List rightSideV…

Ubuntu Server 22.04.5 LTS重启后IP被重置问题

Ubuntu Server 22.04.5 LTS重启后IP被重置问题 最近在使用Ubuntu Server 22.04做项目开发测试时发现每次重启和关机后&#xff0c;所设置的静态IP地址都会回复到安装系统时所设置的ip Ubuntu Server 22.04 官网下载地址&#xff1a;Ubuntu官方下载地址 对虚拟机下安装Ubuntu感…

Python+OpenCV系列:Python和OpenCV的结合和发展

PythonOpenCV系列&#xff1a;Python和OpenCV的结合和发展 **引言****Python语言的发展****1.1 Python的诞生与发展****1.2 Python的核心特性与优势****1.3 Python的应用领域** **OpenCV的发展****2.1 OpenCV的起源与发展****2.2 OpenCV的功能特性****2.3 OpenCV的应用场景** *…

kube-proxy的iptables工作模式分析

系列文章目录 iptables基础知识 文章目录 系列文章目录前言一、kube-proxy介绍1、kube-proxy三种工作模式2、iptables中k8s相关的链 二、kube-proxy的iptables模式剖析1.集群内部通过clusterIP访问到pod的流程1.1.流程分析 2.从外部访问内部service clusterIP后端pod的流程2.1…

CSMM 软件能力成熟度评估认证补贴政策汇总!

CSMM认证&#xff0c;全称为“软件能力成熟度评估”&#xff0c;也被称作“中国版CMMI认证”。这是中国自主制定的软件能力成熟度评估标准&#xff0c;于2021年6月8日发布。该标准由中国电子技术标准化研究院联合多家产学研用相关单位制定&#xff0c;旨在适合中国国情以及中国…

华为网络设备配置文件备份与恢复(上传、下载、导出,导入)

在日常运维工作中&#xff0c;会经常存在网络割接的情况&#xff0c;为了保证网络割接失败时能重新回退至原有配置&#xff0c;从而不影响原有的办公环境&#xff0c;在网络割接前的备份工作就非常有必要了。 备份方式&#xff1a;FTP 备份技术&#xff1a;PC客户端<---&g…

Linux HTTP代理Squid 基本变更配置及目标白名单方式限制转发

1、文件管理转发白名单 sudo touch /etc/squid/whitelistip sudo touch /etc/squid/whitelistdomain # 目的地ip地址 acl whitelistip dst "/etc/squid/whitelistip" http_access allow whitelistip# 目的地域名限制&#xff0c;可使用.xxx.com 放开整个子域名 acl…

清风数学建模学习笔记——Topsis法

数模评价类&#xff08;2&#xff09;——Topsis法 概述 Topsis:Technique for Order Preference by Similarity to Ideal Solution 也称优劣解距离法&#xff0c;该方法的基本思想是&#xff0c;通过计算每个备选方案与理想解和负理想解之间的距离&#xff0c;从而评估每个…

[软件工程]九.可依赖系统(Dependable Systems)

9.1什么是系统的可靠性&#xff08;reliability&#xff09; 系统的可靠性反映了用户对系统的信任程度。它反映了用户对其能够按照预期运行且正常使用中不会失效的信心程度。 9.2什么是可依赖性&#xff08;dependablity&#xff09;的目的 其目的是覆盖系统的可用性&#x…

减少30%人工处理时间,AI OCR与表格识别助力医疗化验单快速处理

在医疗行业&#xff0c;化验单作为重要的诊断依据和数据来源&#xff0c;涉及大量的文字和表格信息&#xff0c;传统的手工输入和数据处理方式不仅繁琐&#xff0c;而且容易出错&#xff0c;给医院的运营效率和数据准确性带来较大挑战。随着人工智能技术的快速发展&#xff0c;…

Jackson使用实例:将后端返回的 JSON 字段名转换为大写(多种方案详细实例实现)

目录 将返回 JSON 字段名转换为大写背景解决方案1. **局部字段名转换为大写** — 使用 JsonNaming 注解方案概述步骤 2. **全局字段名转换为大写** — 配置 ObjectMapper方案概述步骤 3. **手动指定字段名称** — 使用 JsonProperty 注解方案概述步骤 4. **总结**推荐方案 将返…

汽车一键启动开关 、一键启动按键 、一键启动按钮

‌汽车一键启动按钮是智能汽车的重要部分&#xff0c;通常用于启动和关闭引擎‌。 ‌具体功能‌&#xff1a; ‌启动引擎‌&#xff1a;在许多现代汽车中&#xff0c;一键启动按键取代了传统的钥匙启动方式。只需轻轻按下一键启动按钮&#xff0c;车辆电源即被接通&#xff0c…

.NET用C#导入Excel数据到数据库

将Excel文件中的数据导入到数据库中不仅能够提升数据处理的效率和准确性&#xff0c;还能极大地促进数据分析和决策制定的过程。尤其在企业级应用中&#xff0c;Excel作为数据输入和初步整理的工具非常普遍&#xff0c;但其功能对于复杂查询、大规模数据管理和跨部门的数据共享…

python中数组怎么转换为字符串

1、数组转字符串 #方法1 arr [a,b] str1 .join(arr)#方法2 arr [1,2,3] #str .join(str(i) for i in arr)#此处str命名与str函数冲突&#xff01; str2 .join(str(i) for i in arr) 2、字符串转数组 #方法一 str_x avfg st_list list(str_x) #使用list()#方法二 list_s…

国内管理咨询公司哪家落地辅导做的好?

在当今快速变化的市场环境中&#xff0c;企业面临着前所未有的竞争压力与转型挑战。为了在这场没有硝烟的战争中脱颖而出&#xff0c;许多企业开始寻求外部专业力量的帮助&#xff0c;以期通过科学的管理咨询实现战略升级和业绩突破。而在众多的管理咨询公司中&#xff0c;思博…

前端进阶指南:详解 Source Map 的作用与工作原理,解析.map文件

前言 在前端开发中&#xff0c;代码的压缩与混淆是提升网页性能的常见做法。然而&#xff0c;这种优化措施也带来了调试难度的增加&#xff0c;因为压缩后的代码往往难以阅读和理解。这时&#xff0c;Source Map 技术应运而生&#xff0c;作为连接源代码和构建后代码的桥梁&am…

Cursor vs VSCode:主要区别与优势分析

Cursor - The AI Code Editor 1. AI 集成能力 Cursor的优势 原生AI集成&#xff1a; # Cursor可以直接通过快捷键调用AI # 例如&#xff1a;按下 Ctrl K 可以直接获取代码建议 def complex_function():# 在这里&#xff0c;你可以直接询问AI如何实现功能# AI会直接在编辑器中…

python+selenium的八大定位方式

1.id定位 元素的id属 driver.find_element_by_id(By.ID,"username")2.name定位 driver.find_element_by_id(By.NAME,"username")#一个login_btn_list webdriver.find_elements(By.CLASS_NAME,)#多个元素组成的列表&#xff0c; login_btn_list[1].click…

RTCMultiConnection 跨域问题解决

js套件地址 https://github.com/muaz-khan/RTCMultiConnection server套件地址 https://github.com/muaz-khan/RTCMultiConnection-Server 要解决的就是server代码的跨域问题 原装写法&#xff1a; 解决写法&#xff1a; // 喜欢组合语法的自己组 const io new ioServer.S…

【JavaEE】多线程(6)

一、用户态与内核态 【概念】 用户态是指用户程序运行时的状态&#xff0c;在这种状态下&#xff0c;CPU只能执行用户态下的指令&#xff0c;并且只能访问受限的内存空间 内核态是操作系统内核运行时的状态&#xff0c;内核是计算机系统的核心部分&#xff0c;CPU可以执行所有…