Map集合

news/2025/3/14 8:11:29/

Map集合

Map接口的简介

Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value。

Map 没有继承 Collection 接口, Map 提供 key 到 value 的映射,可以通过“键”查找“值”。一个 Map 中不能包含相同的 key ,每个 key 只能映射一个 value 。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8KcLA0qP-1676012985302)(集合容器.assets/image-20220820094156849.png)]

|------Map(接口,键值对的集合(双列集合)

​ |----------HashMap(接口实现类 ,没有同步, 线程不安全)

​ |----------Hashtable(接口实现类,同步,线程安全

​ |----------LinkedHashMap(实现类,双向链表和哈希表实现)

​ |----------TreeMap(实现类, 红黑树对所有的key进行排序)

Map

  • HashMap 非线程安全,基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。

  • TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。

  • HashTable:是同步的,这个类中的一些方法加入了synchronized关键字,保证了HashTable中的对象是线程安全的,

  • LinkedHashMap:需要维护元素的插入顺序,性能低于HashMap,但在迭代访问元素时有很好的性能,但他以链表方式类维护内部顺序的。

HashMap实现类

1、基于哈希表的 Map 接口的实现,便于提高查询的效率。2、此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。3、此类不保证映射的顺序,特别是它不保证该顺序恒久不变。4、基于线程非同步,适用于单线程的环境中。
//HashMap实现类public   static  void    test1(){	Map   map = new  HashMap();//添加元素map.put("a",10);map.put("b",20);map.put("c",30);map.put("d",40);map.put(null, null);//重复的key会发生覆盖map.put("a", 100);//注意!List 和 Set集合最终输出结果的时候,显示的是[元素1,元素2,.......]//{null=null, d=40, b=20, c=30, a=100}-------- 1、map的元素是key-value格式     //2、发现是无序的;  3、允许null键 和  null值 ;    4、重复的key是会发生覆盖的;System.out.println(map);		
}

Map操作API

Map容器添加元素Map容器通过键取值Map容器中的索引(包含)Map容器中通过一个键移除一个值
  • containsKey()
//找对应的键(key),有对应的key返回true,没有则返回false
boolean containsKey(Object key);
  • containsValue()
//找对应的值(value),有则返回true,没有则返回false
boolean containsValue(Object value);
  • isEmpty()
//判断map集合是否有数据,有则返回false,没有则返回true
boolean isEmpty();
  • keySet()
//获取map集合中所有的键(key)
Set<K> keySet();
  • putAll()
//将map集合添加该集合中
void putAll(Map<? extends K, ? extends V> m);

remove()

//根据键(key)移除数据
V remove(Object key);
  • remove()
//根据键(key)和值(value)移除数据,移除成功返回true,移除失败返回false
default boolean remove(Object key, Object value)
  • clone()
//从此HashMap中实例一份副本
public Object clone()
//演示Map操作的API方法----1public   static  void   test2(){Person   person = new  Person("zhangsan",30);Map   map = new  HashMap();//添加元素(key是Object类型,value也是Object类型)map.put("a","admin");map.put("b", "guest");map.put(3, 100);map.put(4, 1000);map.put(new Date(), new Date());map.put("obj",person);map.put(person, person);System.out.println(map);//获取指定的元素值---通过key来获取Object  value1 = map.get(3);System.out.println(value1);value1 =	map.get("obj");System.out.println(value1);//索引包含(可以检测key ,也可以检测value)boolean is = map.containsKey("a");System.out.println(is);//true//针对key使用的是自定义的类型的时候,进行检测,必须要是同一个对象才可以。is = map.containsKey(person);System.out.println(is);is = map.containsValue(person);System.out.println(is);//通过key移除指定的元素Object  obj = map.remove("obj");//返回的就是被删除的对象:Person [name=zhangsan, age=30]System.out.println(obj);//{3=100, 4=1000, b=guest, a=admin, Person [name=zhangsan, age=30]=Person [name=zhangsan, age=30], Tue Jan 11 15:33:33 CST 2022=Tue Jan 11 15:33:33 CST 2022}System.out.println(map);}	
Map容器转化为Set容器(Entry对的集合)
Set set = map.entrySet();Map容器中键转化为Set容器(键的集合)
Set set = map.keySet();Map容器中值转化为Set容器( 值的集合)
Collection c= map.values();Map容器中其他基本判断和操作map.isEmpty();map.clear();map.size();
	// 演示Map操作的API方法--2public static void test3() {Map map = new HashMap();// 添加元素(key是Object类型,value也是Object类型)map.put("a", "admin");map.put("b", "guest");map.put(3, 100);map.put(4, 1000);//将所有的Entry对,转换到一个Set集合中Set  entrySet = map.entrySet();//[3=100, 4=1000, b=guest, a=admin]--------显示的是[]格式,不是{}格式。System.out.println(entrySet);//key-value:  专业类型Entry对;//将key全部转换为一个set集合Set    keySet = map.keySet();//[3, 4, b, a]System.out.println(keySet);//可以直接针对keySet这个集合进行迭代Iterator keyIts = keySet.iterator();while(keyIts.hasNext()){Object  key = keyIts.next();System.out.println(key);}//将所有的值获取Collection   coll = map.values();//[100, 1000, guest, admin]System.out.println(coll);//进行迭代展现coll.iterator();/*** 注意!* 我们发现在Map集合中,是没有提供迭代的方法,因为Map这种结构是无法直接进行迭代操作的;*///集合中的常规操作map.isEmpty();map.size();map.clear();}

提示!

通过以上的Map所有的API的学习,我们发现在Map结构的操作中,主要都是基于key(键)来实现的;

Hashtable实现类

1、此类实现一个哈希表,该哈希表将键映射到相应的值(key-value模式)。2、键或值不允许为null。3、Hashtable 是基于线程同步的,适用于多线程的环境中。4、Hashtable和HashMap的API几乎是一样的。
	public   static   void  test1(){Hashtable  map = new  Hashtable();map.put("a",15);map.put("b",17);map.put("c",18);map.put("d",10);//java.lang.NullPointerException,不允许存在null键和null值的;//map.put(null, null);  错误的//同HashMap比较起来,唯独多出的一个方法Enumeration en = map.elements();//en枚举中保存的是所有的value值,等同于 map.values();while(en.hasMoreElements()){Object obj = en.nextElement();System.out.println(obj);}//其余的API都是一样的;}	

LinkedHashMap实现类

1、LinkedHashMap实现类是HahsMap的子类;2、LinkedHashMap底层使用数据结构是链表 和 hash算法;3、具备了顺序的维护,针对插入、删除做了效率的提升,查询的效率也较高;4、LinkedHashMap也是基于线程非同步的,适用于单线程的环境中;5、LinkedHashMap 和  HashMap的API是完全一致的;
//LinkedHashMap中的API
public  static  void  test1(){LinkedHashMap  map = new  LinkedHashMap();//LinkedHashMap和 HashMap操作的API是完全一致的;map.put("a","admin1");map.put("b","admin2");map.put("c","admin3");map.put("d","admin4");map.put(null, null);//{a=admin1, b=admin2, c=admin3, d=admin4, null=null} ------  维护了插入时的顺序,同时允许null键和null值;System.out.println(map);}

TreeMap实现类

1、TreeMap底层的数据结构是基于二叉树(红黑树)的结构;2、针对TreeMap集合中的key是进行排序的处理的;3、TreeMap是基于线程非同步的,适用于单线程的环境中;4、TreeMap实现类中增添了不少的方法,但是对于我们使用来说,主要依赖的是排序功能,所以增添的这些方法我们了解就可以了;
//Comparable:个接口对实现它的每个类的对象强加了一个总的顺序。
public class Person extends Object implements Comparable{private String name;private Integer age;public Person(){}public Person(Integer age){this.age = age;}public Person(String name,Integer age){this.name = name;this.age = age;}public Person(Integer age,String name){this.name = name;this.age = age;}public String getName(){return name;}public void  setName(String name){this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return name+","+age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return Objects.equals(name, person.name) &&Objects.equals(age, person.age);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic int compareTo(Object o) {if (o instanceof  Person){Person person =(Person) o;// return person.age - this.age;//从大到小return person.name.hashCode() - this.name.hashCode();}return 0;}
}public static void main(String[] args) {TreeMap treeMap = new TreeMap();Person person = new Person(1,"张三");Person person2 = new Person(9,"李四");Person person3 = new Person(3,"王五");Person person4 = new Person(19,"赵六");Person person5 = new Person(2,"唐七");treeMap.put(person,"z");treeMap.put(person2,"z");treeMap.put(person3,"z");treeMap.put(person4,"z");treeMap.put(person5,"z");System.out.println(treeMap);}
}

http://www.ppmy.cn/news/23798.html

相关文章

【STM32笔记】HAL库UART串口配置及重定向(解决接收中断与scanf不能同时工作的问题)

【STM32笔记】HAL库UART串口配置及重定向&#xff08;解决接收中断与scanf不能同时工作的问题&#xff09; 首先 要使用printf和scanf 必不可少的就是 #include <stdio.h>这里需要做的就是配置单片机的UART 并且使其能够被printf和scanf调用 打开异步工作模式 并且选择…

Linux(centOS7)虚拟机中配置 vim

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…

Python获取公众号(pc客户端)数据,使用Fiddler抓包工具

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 今天来教大家如何使用Fiddler抓包工具&#xff0c;获取公众号&#xff08;PC客户端&#xff09;的数据。 Fiddler是一个http协议调试代理工具&#xff0c;它能够记录并检查所有你的电脑和互联网之间的http通讯&#xff0c;…

NoSQL数据库详细介绍

一、NoSQL发展历史 NoSQL 一词最早出现于 1998 年&#xff0c;是 Carlo Strozzi 开发的一个轻量、开源、不提供 SQL 功能的关系数据库。 2009 年&#xff0c;Last.fm 的 Johan Oskarsson 发起了一次关于分布式开源数据库的讨论&#xff0c;来自 Rackspace 的 Eric Evans 再次…

pixhawk2.4.8-APM固件-MP地面站配置过程记录

目录一、硬件准备二、APM固件、MP地面站下载三、地面站配置1 刷固件2 机架选择3 加速度计校准4 指南针校准5 遥控器校准6 飞行模式7 紧急断电&无头模式8 基础参数设置9 电流计校准10 电调校准11 起飞前检查&#xff08;每一项都非常重要&#xff09;12 飞行经验四、遇到的问…

个人学习系列 - 解决拦截器操作请求参数后台无法获取

由于项目需要使用拦截器对请求参数进行操作&#xff0c;可是请求流只能操作一次&#xff0c;导致后面方法不能再获取流了。 新建SpringBoot项目 1. 新建拦截器WebConfig.java /*** date: 2023/2/6 11:21* author: zhouzhaodong* description:*/ Configuration public class W…

可重构或可调谐微波滤波器技术

电子可重构&#xff0c;或者说电调微波滤波器由于其在改善现在及未来微波系统容量中不断提高的重要性而正吸引着人们越来越多的关注来对其进行研究和开发。例如&#xff0c;崭露头脚的超宽带&#xff08;UWB&#xff09;技术要求使用很宽的无线电频谱。然而&#xff0c;作为资源…

电机过流的一次bug排查记录

一、bug现象描述如下&#xff1a; 有一天&#xff0c;某员工给自己的组件换一个语音模块&#xff0c;其中电机和主板是通过单总线连接&#xff0c;据该员工回忆曾经在换语音芯片时曾将电源线不小心短路过。 电机已经DVT试产&#xff0c;功能和硬件测试已经通过&#xff0c;但是…