【JAVA语言-第18话】集合框架(五)——Map、HashMap、LinkedHashMap、TreeMap集合

目录

双列集合Map

1.1 概述

1.2 特点

1.3 Map接口中的常用方法

1.3.1 练习

1.4 HashMap集合

1.4.1 概述 

1.4.2 特点

1.5 LinkedHashMap集合

1.5.1 概述

1.5.2 特点

1.6 TreeMap集合 

1.6.1 概述 

1.6.2 特点

1.7 Map集合练习

1.8 HashMap、LinkedHashMap、TreeMap的区别


双列集合Map

1.1 概述

        java.util.Map:Map是一种接口,用于表示键值对的集合。它提供了一种将键映射到值的方式,其中每个键只能映射到一个值。Map提供了一组方法来操作和访问其中的元素。Map中的键是唯一的,每个键对应一个值。可以通过键来访问和更新值。常见的实现类包括HashMap、LinkedHashMap、TreeMap等。

1.2 特点

  • Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)。
  • Map集合中的元素,key和value的数据类型可以相同,也可以不同。
  • Map集合中的元素,key是不允许重复的,value是可以重复的。
  • Map集合中的元素,key和value是一一对应的。

1.3 Map接口中的常用方法

public V put(K key,V value):把指定的键与指定的值添加到Map集合中。
        返回值:V
                存储键值对的时候,key不重复,返回值V为null。
                存储键值对的时候,key重复,会使用新的value值替换Map中重复的value,返回被替换掉的value值。

        
public V remove(Object key):把指定的键所对应的键值对元素在Map集合中删除,返回被删除元素的值。
        返回值:V
                key存在,V返回被删除的值。
                key不存在,V返回null。

        
public V get(Object key):根据指定的键,在Map集合中获取对应的值。
        返回值:V
                可以存在,V返回对应的value值。
                可以不存在,V返回null。

        
public boolean containsKey(Object key):判断集合中是否包含指定的键。
        返回值:包含返回true,不包含返回false。

        
public Set<K> keySet():获取Map集合中所有的键,存储到Set集合中。
        作用:通过键找值的方式去遍历Map集合。
        实现步骤:
                1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中。
                2.遍历set集合,获取Map集合中的每一个key。
                3.通过Map集合中的方法get(key),通过key找到value。

        
public Set<Map.Entry<K,V>> entrySet:获取到Map集合中所有的键值对对象的集合(Set集合)。
        作用:使用Entry对象遍历Map集合。
        实现步骤:
                1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中。
                2.遍历Set集合,获取每一个Entry对象。
                3.使用Entry对象中的方法getKey和getValue获取键和值。

1.3.1 练习

package com.zhy.coll;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class TestMap {public static void main(String[] args) {//创建Map集合对象,多态Map<String,Integer> map = new HashMap<>();//1.put:将指定的键与指定的值添加到Map集合中map.put("zhangsan",17);map.put("lisi",29);Integer i = map.put("wangwu",30);Integer i2 = map.put("zhangsan",27);System.out.println("存储不重复key的返回值:" + i);System.out.println("存储重复key的返回值:" + i2);System.out.println("初始化Map集合:" + map);System.out.println();//2.remove:根据key移除Map集合中的元素Integer i3 = map.remove("zenghai");Integer i4 = map.remove("lisi");System.out.println("移除集合中不存在key的返回值:" + i3);System.out.println("移除集合中存在key的返回值:" + i4);System.out.println("移除元素指定key之后的集合:" + map);System.out.println();//3.get:根据key获取集合中对应的值Integer i5 = map.get("zhangsan");Integer i6 = map.get("haidi");System.out.println("获取集合中存在的key的返回值:" + i5);System.out.println("获取集合中不存在的key的返回值:" + i6);System.out.println();//4.containsKey:判断集合中是否包含key,包含返回true,不包含返回falseSystem.out.println("集合中是否包含zhangsan的key:" + map.containsKey("zhangsan"));System.out.println("集合中是否包含zengyue的key:" + map.containsKey("zengyue"));System.out.println();//5.keySet:将map中所有的键存储到Set集合中,然后通过迭代器或者增强for遍历System.out.print("使用keySet遍历Map集合:");Set<String> keySets = map.keySet();for (String key : keySets){Integer value = map.get(key);System.out.print(key + "=" + value + "\t");}//6.entrySet:将map中所有的键值对存储在Set集合中,使用Entry对象遍历Map集合System.out.print("\n使用entrySet遍历Map集合:");Set<Map.Entry<String, Integer>> entrySets = map.entrySet();for (Map.Entry<String, Integer> keyAndValue : entrySets){String key = keyAndValue.getKey();Integer value = keyAndValue.getValue();System.out.print(key + "=" + value + "\t");}}
}

注:HashMap存储自定义类型键值,Map集合保证键是唯一的:作为key的元素,必须重写hashCode和equals方法,以保证key唯一。

1.4 HashMap集合

1.4.1 概述 

        java.util.HashMap:HashMap是一种实现了Map接口的键值对存储结构。它是基于哈希表的实现,通过哈希函数将键映射到数组中的位置来存储和检索值

1.4.2 特点

  • HashMap集合底层是哈希表:查询的速度特别的快。
  • HashMap集合是一个无序的集合,不保证元素的顺序,也不保证迭代顺序
  • HashMap允许存储null键和null值,并允许多个null值存储。
  • HashMap中的键和值可以是任意类型的对象,通过hashCode()和equals()方法来确定键的唯一性。如果两个键的hashCode()值相等并且equals()方法返回true,则将被视为同一个键,后插入的值会覆盖旧值。
package com.zhy.coll;import java.util.HashMap;public class TestMap {public static void main(String[] args) {//HashMap特点:无序,不可存储重复元素HashMap<String,Integer> hashMap = new HashMap<>();hashMap.put("zhangsan",18);hashMap.put("lisi",30);hashMap.put("wangwu",27);hashMap.put("zhangsan",35);System.out.println(hashMap);//输出:{lisi=30, zhangsan=35, wangwu=27}}
}

1.5 LinkedHashMap集合

1.5.1 概述

        java.util.LinkedHashMap:LinkedHashMap是Java的一种实现了Map接口的类,它继承自HashMap类。它是一种既保留了插入顺序又保留了访问顺序的Map,即可以通过插入顺序或访问顺序来遍历。与HashMap不同的是,LinkedHashMap在内部使用了双向链表来维护插入顺序或访问顺序。

1.5.2 特点

  • LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)。
  • LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的。
package com.zhy.coll;import java.util.LinkedHashMap;public class TestMap {public static void main(String[] args) {//LinkedHashMap特点:有序(根据键插入的顺序),不可存储重复元素//如果遇到重复元素,键不变,值改为最新的LinkedHashMap<String,Integer> linkedHashMap = new LinkedHashMap();linkedHashMap.put("zhangsan",18);linkedHashMap.put("lisi",30);linkedHashMap.put("wangwu",27);linkedHashMap.put("zhangsan",35);System.out.println(linkedHashMap);//输出:{zhangsan=35, lisi=30, wangwu=27}}
}

1.6 TreeMap集合 

1.6.1 概述 

        java.util.TreeMap:在Java中,TreeMap是一种实现了SortedMap接口的类,它按照键的自然顺序进行排序。它是一个有序的键值对集合,基于红黑树数据结构实现,可以快速地进行插入、删除和查找操作。 

1.6.2 特点

  • 键值对按 键 的顺序进行排序,并且支持快速的查找操作。
  • TreeMap可以存储不重复的键值对,键不能为null,值可以为null。
  • TreeMap是基于红黑树实现的,所以插入、删除和查找操作的时间复杂度都为O(log n)。 
package com.zhy.coll;import java.util.*;public class TestMap {public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("aaa",28);map.put("ccc",30);map.put("bbb",34);//输出:{aaa=28, bbb=34, ccc=30}//treeMap会对存储的元素根据键进行排序System.out.println(map);//TreeMap的key不能存储空值,会引发空指针异常:java.lang.NullPointerExceptionmap.put(null,null);//但是value可以存储nullmap.put("ddd",null);}
}

1.7 Map集合练习

计算一个字符串中每个字符出现的次数。

package com.zhy.coll;import java.util.*;public class TestMap {public static void main(String[] args) {//1.定义一个map集合,键为字符,值为字符出现的次数Map<Character,Integer> map = new LinkedHashMap<>();//2.使用Scanner类,从键盘接收一个字符串Scanner sc = new Scanner(System.in);String str = sc.nextLine();//3.将字符串转换成字符数组,遍历每一个字符char[] strArray = str.toCharArray();for (char c : strArray){//4.判断字符,如果map中已经存在,则根据key或者对应的value,然后+1if (map.containsKey(c)){map.put(c,map.get(c) + 1);}else {//5.如果map中不存在,则将字符加入到map中,value=1map.put(c,1);}}//6.遍历集合Set<Character> characters = map.keySet();for (Character c : characters){System.out.println(c + "出现了" + map.get(c) + "次");}}
}

1.8 HashMap、LinkedHashMap、TreeMap的区别

HashMap、LinkedHashMap和TreeMap是Java中常用的三种Map实现类,它们的区别如下:

集合数据结构元素是否有序元素是否排序性能键为空
HashMap哈希表无序不排序允许
LinkedHashMap哈希表+链表按照插入顺序不排序允许
TreeMap红黑树从小到大排序排序不允许

总结:HashMap适用于大部分场景下的快速查找;LinkedHashMap适用于保持插入顺序的场景;TreeMap适用于有序存储和范围查找的场景。

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

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

相关文章

Linux+Win双系统远程重启到Win

背景 电脑安装了双系统&#xff08;ubuntu 22.04 win11&#xff09;&#xff0c;默认进入ubuntu系统。给电脑设置了WoL(Wake-on-LAN)&#xff0c;方便远程开机远程控制。 但是ubuntu的引导程序grub无法远程控制&#xff0c;远程开机会默认进入ubuntu。 虽然说可以进入ubuntu后…

【JavaEE】_HTTP响应

目录 1. 首行 2. 报头header 3.空行 4. 正文body 1. 首行 响应首行&#xff1a;版本号状态码状态码描述&#xff1b; HTTP状态码描述了这次响应的结果&#xff08;比如成功、失败&#xff0c;以及失败原因等&#xff09;&#xff1b; 1. HTTP状态码有&#xff1a; &#…

typescript字面量类型

typescript 字面量介绍 在TypeScript中&#xff0c;字面量是指在代码中直接使用的具体值&#xff0c;如字符串、数字、布尔值等。字面量类型是TypeScript中的一种特殊类型&#xff0c;它用于定义一组有限的值&#xff0c;并且可以在定义变量或函数时使用字面量作为具体值&…

⭐北邮复试刷题103. 二叉树的锯齿形层序遍历 (力扣每日一题)

103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a;输入&#xff1a…

沪上阿姨冲刺上市:规模不及古茗等,单卫钧、周蓉蓉受益突击分红

奶茶品牌上市潮来袭。2月14日&#xff0c;沪上阿姨&#xff08;上海&#xff09;实业股份有限公司&#xff08;下称“沪上阿姨”&#xff09;递交招股书&#xff0c;准备在港交所主板上市&#xff0c;中信证券、海通国际、东方证券国际为其联席保荐人。 此前&#xff0c;茶百道…

【动态规划】【C++算法】2742. 给墙壁刷油漆

作者推荐 【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 本文涉及知识点 动态规划汇总 LeetCode2742. 给墙壁刷油漆 给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time &#xff0c;分别表示给 n 堵不同的墙刷油漆需要的开销和时间。你有…

【C++】C++入门—初识构造函数 , 析构函数,拷贝构造函数,赋值运算符重载

C入门 六个默认成员函数1 构造函数语法特性 2 析构函数语法特性 3 拷贝构造函数特性 4 赋值运算符重载运算符重载赋值运算符重载特例&#xff1a;前置 与 后置前置&#xff1a;返回1之后的结果后置&#xff1a; Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&…

电视盒子什么牌子好?老烧实测2024电视盒子排行榜

电视盒子价格不贵&#xff0c;但功能丰富&#xff0c;看点播、直播&#xff0c;玩游戏&#xff0c;上网课等都不在话下&#xff0c;对大部分家庭来说电视盒子是必备的。不过面对众多产品的时候我们都不知道电视盒子什么牌子好&#xff0c;我是多年电视盒子老用户了&#xff0c;…

ARM 之十六 详解 CMSIS 版本变迁、各组件使用示例

目前,CMSIS 已经发展到了第六版,其目录结构也发生了重大的变化。在不断发展中,很多原来 CMSIS 的组件被不断独立出去,并因此成立了很多开源社区,今天就来学习一下! 由于 CMSIS 已经包含了相当丰富的文档,因此,本文重点学习版本之间的变化以及一些实际使用示例。 什么是…

常见设计模式详细版

文章目录 单例模式饿汉式单例模式懒汉式单例模式双重检索单例模式 工厂模式简单工厂模式工厂&#xff08;方法&#xff09;模式抽象工厂模式 原型模式代理模式 单例模式 确保一个类只有一个实例&#xff0c;并且自行实例化并向整个系统提供这个实例。 饿汉式单例模式 饿汉式单…

统计图柱形图绘制方法

统计图柱形图绘制方法 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制&#xff0c;饼图环形图绘制较难。 今提供条形图和柱形图的绘制方法&#xff0c;附加环形图和艺术环图的绘制方法供参考。 本方法采用C语言的最基本功能&…

力扣51. N 皇后(回溯)

Problem: 51. N 皇后 文章目录 题目描述思路解决方法复杂度Code 题目描述 思路 1.决策路径&#xff1a;board中小于row的那些行都已经成功放置了皇后&#xff1b; 2.选择列表&#xff1a;第row行的所有列都是放置皇后的选择&#xff08;则根据N皇后相互攻击的股则编写判断当前决…