13.7 Map 接口(血干JAVA系列)

news2024/11/15 11:20:17

这里写目录标题

  • 13.7.1 Map接口简介
  • 13.7.2 Map.Entry接口简介
  • 13.7.3 Map接口的常用子类
    • 1.新的子类:HashMap
    • 2.相关操作实例
      • (1)实例操作1——向集合中增加和取出内容
        • 【例13.26】增加和取得内容
      • (2)实例操作2------------ 判断指定的key或value是否存在
        • 【例13.27】判断指定内容是否存在
      • (3)实例操作3——输出全部的key
        • 【例13.28】输出全部的key
      • (4)实例操作4——输出全部的value
        • 【例13.29】输出全部的value
    • 3.旧的子类:Hashtable
      • 【例 13.30】 Hashtable 操作
    • 4. HashMap 与 Hashtable 的区别
    • 5.排序的子类:TreeMap
      • 【例13.31】观察TreeMap排序
  • 13.7.4 Map接口的使用注意事项
    • 1.注意事项1——不能直接使用迭代输出Map中的全部内容
      • (1) Map 输出方式 1: Iterator 输出 Map
      • (2) Map输出方式2: foreach输出Map
    • 2.注意事项2——直接使用非系统类作为key
      • 【例 13.34】 String-->Person 映射
      • 【例 13.35】 Person-->String 映射
      • 【例13.36】声明Person对象--> String映射
      • 【例13.37】覆写equals()和hashCode()方法
  • 13.7.5 key 可以重复的 Map 集合:IdentityHashMap
      • 【例13.38】 Map中的key不允许重复,重复就是覆盖
      • 【例13.39】使用IdentityHashMap修改程序

13.7.1 Map接口简介

在这里插入图片描述
在这里插入图片描述

13.7.2 Map.Entry接口简介

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

13.7.3 Map接口的常用子类

在这里插入图片描述

1.新的子类:HashMap

在这里插入图片描述
在这里插入图片描述

2.相关操作实例

(1)实例操作1——向集合中增加和取出内容

在Map接口中使用put(Object key,Object value)方法可以向集合中增加内容,然后可以通过get(E key)方法根据key找出其对应的value。

【例13.26】增加和取得内容
package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String,String>();
		map.put("s1","s1_value");
		map.put("s2","s2_value");
		map.put("s3","s3_value");
		map.put("s4","s4_value");
		System.out.println(map.get("s1"));
		System.out.println(map.get("s2"));
		System.out.println(map.get("s3"));
		System.out.println(map.get("s4"));
	}
}

(2)实例操作2------------ 判断指定的key或value是否存在

【例13.27】判断指定内容是否存在

如 果 要 判 断 某 一 个 指 定 的 k e y 或 v a l u e 是 否 存 在 , 可 以 使 用 M a p 接 口 中 提 供 的 containsKey(Object key)和 containsValue(Object value)两个方法,前者是判断 Map 集合是否存在指定的key,后者是判断Map集合是否存在指定的value。

package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String,String>();
		map.put("s1","s1_value");
		map.put("s2","s2_value");
		map.put("s3","s3_value");
		map.put("s4","s4_value");
		System.out.println("是否包含key:s1】"+map.containsKey("s1"));
		System.out.println("是否包含value:s1_value】"+map.containsValue("s1_value"));
	}
}

(3)实例操作3——输出全部的key

【例13.28】输出全部的key

在 M a p 中 提 供 了 一 个 叫 做 k e y S e t ( ) 的 方 法 , 可 以 将 一 个 M a p 中 的 全 部 k e y 变 为 一 个 S e t 集合,一旦有了 Se t 实例,就可以直接使用I t e r a t o r接口输出。但是在进行操作的时候一定要注意的是,接收的Set集合里指定的泛型要和Map中key的泛型类型保持一致。

Set<String> allSet = map.keySet();
package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String,String>();
		map.put("s1","s1_value");
		map.put("s2","s2_value");
		map.put("s3","s3_value");
		map.put("s4","s4_value");
		Set<String> allSet = map.keySet();
		
		Iterator<String> iter = allSet.iterator();
		while(iter.hasNext()) {
			String str = iter.next();
			System.out.println(str);
		}
	}
}

(4)实例操作4——输出全部的value

【例13.29】输出全部的value

如果要输出全部的value,则使用values()方法,但是此方法的返回类型是Collectiono在进行操作的时候同样也需要注意泛型的类型。

package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String,String>();
		map.put("s1","s1_value");
		map.put("s2","s2_value");
		map.put("s3","s3_value");
		map.put("s4","s4_value");
		Collection<String> allSet = map.values();
		Iterator<String> iter = allSet.iterator();
		while(iter.hasNext()) {
			String str = iter.next();
			System.out.println(str);
		}
	}
}

3.旧的子类:Hashtable

Hashtable也是Map中的一个子类,与Vector类的推出时间是一样的,都是属于旧的操作类, 其使用上也和之前没有太大的区别。

【例 13.30】 Hashtable 操作

package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> map = new Hashtable<String,String>();
		map.put("s1","s1_value");
		map.put("s2","s2_value");
		map.put("s3","s3_value");
		map.put("s4","s4_value");
		System.out.println("key");
		Set<String> allSet = map.keySet();
		Iterator<String> iter_key = allSet.iterator();
		while(iter_key.hasNext())
		{
			String str = iter_key.next();
			System.out.println(str);
		}
		
		
		Collection<String> allCollection = map.values();
		Iterator<String> iter = allCollection.iterator();
		System.out.println("value");
		while(iter.hasNext()) {
			String str = iter.next();
			System.out.println(str);
		}
	}
}

4. HashMap 与 Hashtable 的区别

在这里插入图片描述

5.排序的子类:TreeMap

之前的两个类在存放数据的时候并没有对其进行排序,细心的读者可以发现在前面输出全部key的时候是无序的,而TreeMap子类的主要功能是可以按key排序。

【例13.31】观察TreeMap排序

package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> allMap = new TreeMap<String, String>();
		allMap.put("AAA", "AAA_value");
		allMap.put("DDD", "DDD_value");
		allMap.put("BBB", "BBB_value");
		allMap.put("CCC", "CCC_value");
		allMap.put("AAA", "AAA_value_fuben");
//		System.out.println(allMap);
		Set<String> allSet = allMap.keySet();
		Iterator<String> iter = allSet.iterator();
		while(iter.hasNext())
		{
			System.out.print(allMap.get(iter.next())+"\t");
		}
	}
}

在这里插入图片描述

13.7.4 Map接口的使用注意事项

1.注意事项1——不能直接使用迭代输出Map中的全部内容

在这里插入图片描述

(1) Map 输出方式 1: Iterator 输出 Map

package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> allMap = new HashMap<String, String>();
		allMap.put("AAA", "AAA_value");
		allMap.put("DDD", "DDD_value");
		allMap.put("BBB", "BBB_value");
		allMap.put("CCC", "CCC_value");
		Set<Map.Entry<String, String>> allSet = allMap.entrySet();
		Iterator<Map.Entry<String, String>> iter = allSet.iterator();
		while(iter.hasNext())
		{
			Map.Entry<String, String> e = iter.next();
			System.out.print(e.getKey()+"\t"+e.getValue()+"\n");
		}
	}
}

(2) Map输出方式2: foreach输出Map

在这里插入图片描述

package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> allMap = new HashMap<String, String>();
		allMap.put("AAA", "AAA_value");
		allMap.put("DDD", "DDD_value");
		allMap.put("BBB", "BBB_value");
		allMap.put("CCC", "CCC_value");
		Set<Map.Entry<String, String>> allSet = allMap.entrySet();
		for(Map.Entry<String, String> e:allSet)
		{
			System.out.print(e.getKey()+"\t"+e.getValue()+"\n");
		}
	}
}

2.注意事项2——直接使用非系统类作为key

【例 13.34】 String–>Person 映射

package jiaqi;

import java.util.*;
class Person_
{
	private String name;
	private int age;
	public Person_(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	public String toString() 
	{
		return this.name+"的age是:"+this.age;
	}
}
public class temp {

	public static void main(String[] args) {
		Map<String, Person_> allMap = new HashMap<String,Person_>();
		allMap.put("zhangsan", new Person_("张三",20));
		System.out.println(allMap.get("zhangsan"));
	}
}

在这里插入图片描述

【例 13.35】 Person–>String 映射

package jiaqi;

import java.util.*;
class Person_
{
	private String name;
	private int age;
	public Person_(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	public String toString() 
	{
		return this.name+"的age是:"+this.age;
	}
}
public class temp {

	public static void main(String[] args) {
		Map<Person_,String> allMap = new HashMap<Person_,String>();
		allMap.put( new Person_("张三",20),"zhangsan");
		System.out.println(allMap.get(new Person_("张三",20)));
	}
}

在这里插入图片描述
在这里插入图片描述

【例13.36】声明Person对象–> String映射

package jiaqi;

import java.util.*;
class Person_
{
	private String name;
	private int age;
	public Person_(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	public String toString() 
	{
		return this.name+"的age是:"+this.age;
	}
}
public class temp {

	public static void main(String[] args) {
		Map<Person_,String> allMap = new HashMap<Person_,String>();
		Person_ per =  new Person_("张三",20);
		allMap.put(per,"zhangsan");
		System.out.println(allMap.get(per));
	}
}

在这里插入图片描述
在这里插入图片描述

【例13.37】覆写equals()和hashCode()方法

package jiaqi;

import java.util.*;
class Person_
{
	private String name;
	private int age;
	public Person_(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	@Override
	public boolean equals(Object obj) {
		if(this==obj)return true;
		if(!(obj instanceof Person_))return false;
		Person_ per = (Person_)obj;
		if(this.name.equals(per.name)&&this.age==per.age) return true;
		else return false;
	}
	public int hashCode() 
	{
		return this.name.hashCode()*this.age;
	}
	public String toString() 
	{
		return this.name+"的age是:"+this.age;
	}
}
public class temp {

	public static void main(String[] args) {
		Map<Person_,String> allMap = new HashMap<Person_,String>();
		allMap.put(new Person_("张三",20),"zhangsan");
		System.out.println(allMap.get(new Person_("张三",20)));
	}
}

在这里插入图片描述
在这里插入图片描述

13.7.5 key 可以重复的 Map 集合:IdentityHashMap

之前讲解的所有Map操作中key的值是不能重复的,例如,HashMap操作的时候key是不能重复的,如果重复肯定会覆盖之前的内容,如下面代码所示。

【例13.38】 Map中的key不允许重复,重复就是覆盖

package jiaqi;

import java.util.*;
class Person_
{
	private String name;
	private int age;
	public Person_(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	@Override
	public boolean equals(Object obj) {
		if(this==obj)return true;
		if(!(obj instanceof Person_))return false;
		Person_ per = (Person_)obj;
		if(this.name.equals(per.name)&&this.age==per.age) return true;
		else return false;
	}
	public int hashCode() 
	{
		return this.name.hashCode()*this.age;
	}
	public String toString() 
	{
		return this.name+"的age是:"+this.age;
	}
}
public class temp {

	public static void main(String[] args) {
		Map<Person_,String> allMap = new HashMap<Person_,String>();
		allMap.put(new Person_("张三",20),"zhangsan——1");
		allMap.put(new Person_("张三",20),"zhangsan——2");
		allMap.put(new Person_("李四",21),"李四");
		Set<Map.Entry<Person_, String>> allSet = allMap.entrySet();
		Iterator<Map.Entry<Person_, String>> iter = allSet.iterator();
		while(iter.hasNext())
		{
			Map.Entry<Person_,String> e = iter.next();
			System.out.println(e.getKey()+"\t"+e.getValue());
		}
		System.out.println();
	}
}

在这里插入图片描述
在这里插入图片描述

【例13.39】使用IdentityHashMap修改程序

package jiaqi;

import java.util.*;
class Person_
{
	private String name;
	private int age;
	public Person_(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	@Override
	public boolean equals(Object obj) {
		if(this==obj)return true;
		if(!(obj instanceof Person_))return false;
		Person_ per = (Person_)obj;
		if(this.name.equals(per.name)&&this.age==per.age) return true;
		else return false;
	}
	public int hashCode() 
	{
		return this.name.hashCode()*this.age;
	}
	public String toString() 
	{
		return this.name+"的age是:"+this.age;
	}
}
public class temp {

	public static void main(String[] args) {
		Map<Person_,String> allMap = new IdentityHashMap<Person_,String>();
		allMap.put(new Person_("张三",20),"zhangsan——1");
		allMap.put(new Person_("张三",20),"zhangsan——2");
		allMap.put(new Person_("李四",21),"李四");
		Set<Map.Entry<Person_, String>> allSet = allMap.entrySet();
		Iterator<Map.Entry<Person_, String>> iter = allSet.iterator();
		while(iter.hasNext())
		{
			Map.Entry<Person_,String> e = iter.next();
			System.out.println(e.getKey()+"\t"+e.getValue());
		}
		System.out.println();
	}
}

在这里插入图片描述

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

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

相关文章

代码随想录day19(2)二叉树:二叉树的最大深度(leetcode104)

题目要求&#xff1a;求出二叉树的最大深度 思路&#xff1a;首先要区分二叉树的高度与深度。二叉树的高度是任一结点到叶子结点的距离&#xff0c;而二叉树的深度指的是任一节点到根节点的距离&#xff08;从1开始&#xff09;。所以求高度使用后序遍历&#xff08;从下往上&…

金蝶云星空对接打通阿里宜搭逐个单据查询接口与新增表单实例接口

金蝶云星空对接打通阿里宜搭逐个单据查询接口与新增表单实例接口 数据源平台:金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践&#xff0c;面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司&#xff0c;提供一个通用的ERP服务平台。…

392.判断子序列

题目&#xff1a;给定字符串s和t&#xff0c;判断s是否为t 的子序列。 字符串的一个子序列是原始字符串删除一些字符而不改变剩余字符相对位置形成的新字符串。 解题思路&#xff1a;s是否是 t 的子序列&#xff0c;因此只要能找到任意一种 s 在 t 中出现的方式&#xff0c;即…

义乌购关键字搜索API接口技术详解与代码示例

义乌购关键字搜索API接口技术详解与代码示例 在电子商务蓬勃发展的今天&#xff0c;义乌购作为国内知名的批发市场平台&#xff0c;为广大商家和消费者提供了丰富的商品资源。为了方便开发者快速接入义乌购平台&#xff0c;实现商品信息的搜索与获取&#xff0c;义乌购开放了关…

ROS 语音交互(三) tts

目录 一、模型选择 二、流程 三、核心代码展示 一、模型选择 科大讯飞超拟人识别 二、流程 超拟⼈合成协议 | 讯飞开放平台文档中心 (xfyun.cn) 三、核心代码展示 # coding: utf-8 import _thread as thread import os import time import base64import base64 import …

react/vue项目刷新页面404的原因以及解决办法

项目 公司官网 背景 1、问题描述&#xff1a;react/vue项目&#xff0c;正常的页面操作跳转&#xff0c;不会出现404的问题&#xff0c;但是一旦刷新&#xff0c;就会出现404报错 2、产生原因&#xff1a;我们打开react/vue打包后生成的dist文件夹&#xff0c;可以看到只有一…

Windows系统下载安装Plex媒体服务结合内网穿透远程访问本地影音文件

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

web项目的搭建

使用Webstorm并创建Next.js文件 1、配置nodejs环境、安装webstorm【配置node.js可以使用nvm去管理nodejs的版本】 2、需要破解webstorm&#xff0c;可能会导致原本的idea失效&#xff0c;注册码过期 3、taobao的npm过期&#xff0c;导致npm is sass执行不成功&#xff0c;需…

python基础篇--学习记录2

1.深浅拷贝 l1 ["张大仙","徐凤年",["李淳刚","邓太阿"]] # 变量名对应的就是内存地址,这里就是将l1的内存地址给了l2 # 现在两个变量指向同一个内存地址,l1变化l2也会变化 l2 l1 现在的需求是l2是l1的拷贝版本,但是两者是完全分割…

基于FPGA的以太网传输图片通过HDMI显示(含源码)

在此之前&#xff0c;已经讲解过HDMI、UDP、DDR3等模块的使用&#xff0c;前文在使用HDMI显示图片时&#xff0c;由于没有讲解DDR3&#xff0c;使用FPGA内部的RAM存储图像数据&#xff0c;因为FPGA片上RAM的资源有限&#xff0c;导致最终显示放大的图片失真严重。 本文通过DDR3…

RabbitMQ 模拟实现【四】:虚拟主机设计

文章目录 虚拟主机设计虚拟主机分析交换机和虚拟主机之间的从属关系核心 API发布消息订阅消息应答消息消费者管理类 虚拟主机设计 虚拟主机分析 类似于 MySQL 的 database&#xff0c;把交换机&#xff0c;队列&#xff0c;绑定&#xff0c;消息…进⾏逻辑上的隔离&#xff0…

外包干了20天,技术退步明显......

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

v-model 粗略解析

v-model 粗略解析 v-model是什么&#xff1f; 双向数据绑定&#xff0c;可以从data流向页面&#xff0c;也可以从页面流向data通常用于表单收集&#xff0c;v-model 默认绑定 value 值书写形式&#xff1a; v-model:value"" 或 v-model v-model原理是什么&#xf…

HTML5+CSS3+JS小实例:全屏背景切换动画

实例:全屏背景切换动画 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-s…

【论文笔记合集】LSTNet之循环跳跃连接

本文作者&#xff1a; slience_me LSTNet 循环跳跃连接 文章仅作为个人笔记 论文链接 文章原文 LSTNet [25] introduces convolutional neural networks (CNNs) with recurrent-skip connections to capture the short-term and long-term temporal patterns. LSTNet [25]引入…

电脑闹钟软件,电脑上定时提醒的软件

我们生活在一个忙碌的时代&#xff0c;工作、学习、生活等各种事务时常让我们忙得不知所措。而在这样的情况下&#xff0c;一款电脑闹钟软件&#xff0c;电脑上定时提醒的软件就成为了我们不可或缺的工具之一。 电脑闹钟软件&#xff0c;电脑上定时提醒的软件&#xff0c;是一…

SpringBoot集成flyway

简介 Flyway 是一款开源的数据库版本管理工具&#xff0c;它更倾向于规约优于配置的方式。Flyway 可以独立于应用实现管理并跟踪数据库变更&#xff0c;支持数据库版本自动升级&#xff0c;并且有一套默认的规约&#xff0c;不需要复杂的配置&#xff0c;Migrations 可以写成 …

Leetcode 1514 概率最大的路径

文章目录 1. 题目描述2. 我的尝试 1. 题目描述 原题链接&#xff1a;Leetcode 1514 概率最大的路径 给你一个由 n 个节点&#xff08;下标从 0 开始&#xff09;组成的无向加权图&#xff0c;该图由一个描述边的列表组成&#xff0c;其中 edges[i] [a, b] 表示连接节点 a 和 b…

数据分析可视化神器---streamlit框架,各种图表绘制,布局以及生产综合案例剖析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

实践致知第9享:Word中标题编号无法正常编辑

一、背景需求 在编辑文档时&#xff0c;多级目录结构却无法正常编辑。 二、解决方案 1右键选择“项目符号和编号”查看是否上下文中的编号格式都保持一致&#xff0c;如下图所示。 2当调整到同一种样式之后&#xff0c;用格式刷刷一下需要编辑的标题&#xff0c;先刷成同级别…