【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.mzph.cn/news/688152.shtml

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

相关文章

【EI会议征稿通知】第五届城市工程与管理科学国际会议(ICUEMS 2024)

【Scopus稳定检索】第五届城市工程与管理科学国际会议&#xff08;ICUEMS 2024&#xff09; 2024 5th International Conference on Urban Engineering and Management Science 第五届城市工程与管理科学国际会议&#xff08;ICUEMS 2024&#xff09;将于2024年5月31日-6月2日…

GitKraken Create Repository and Clone不可点击

问题 GitKraken Create Repository and Clone不可点击 详细问题 笔者第一次使用GitKraken&#xff0c;在创建仓库时&#xff0c;填写完成仓库初始化后。发现Create Repository and Clone不可点击。 解决方案 选择Where to clone to位置 产生原因 在创建仓库时&#xff0…

洛谷: P1479 宿舍里的故事之五子棋

题目链接: https://www.luogu.com.cn/problem/P1479 思路: 这道题目可以打表或者搜索。每个位置有选择/不选择两种情况。搜索的时候我们一行一行的搜索&#xff0c;直到使用的棋子达到n为止。b[i]为五子连线的数量&#xff0c;b[i] 1表示五子连线的数量可以取i&#xff0c;在…

day6:继承与多态

思维导图 2.编程题&#xff1a; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a;比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff…

如何引导llm为自己写prompt生成剧本

如何使用写prompt让你自己生一个狗血修仙穿越短剧&#xff0c;且短剧有趣生动让人流连忘返 好的&#xff0c;我会尝试编写一个狗血修仙穿越短剧的prompt&#xff0c;以激发你的想象力&#xff0c;让你创作出一个既有趣又生动的短剧。以下是我的prompt&#xff1a; 标题&#x…

简洁高效的短链接:优化互联网体验

title: 简洁高效的短链接&#xff1a;优化互联网体验 date: 2024/2/18 13:24:24 updated: 2024/2/18 13:24:24 tags: 短链接长网址缩短美观简洁分享优化点击率提升数据统计用户体验 在互联网时代&#xff0c;我们经常遇到需要分享长网址的情况。长网址不仅不美观&#xff0c;而…

Mysql开启bin-log日志

目录 一、安装配置 二、mysqlbinlog命令 一、安装配置 yum -y install mariadb mariadb-server#安装mysql数据库#默认配置文件/etc/my.cnfvim /etc/my.cnflog-binmariadb-bin #开启二进制日志 systemctl restart mariadb#会在/car/lib/mysql/产生二进制日志文件&#xff0…

防火墙(三) -----------------关于iptables规则的保存

一、关于iptables规则的保存 之前写的iptables的设置&#xff0c;但是都是临时生效的&#xff0c;一旦电脑重启&#xff0c;那么就会失效&#xff0c;如何永久保存&#xff0c;需要借助iptables-save命令&#xff0c;开机生效需要借助iptables-restore命令&#xff0c;并写入规…

AB测试最小样本量

1.AB实验过程 常见的AB实验过程&#xff0c;分流-->实验-->数据分析-->决策&#xff1a;分流&#xff1a;用户被随机均匀的分为不同的组实验&#xff1a;同一组内的用户在实验期间使用相同的策略&#xff0c;不同组的用户使用相同或不同的策略。数据收集&#xff1a;…

HOOPS发布全新CAD文件支持以及改进的API性能版本!增加了对Navisworks和C#支持!

全球工程软件开发工具包的领先提供商Tech Soft 3D今天宣布推出HOOPS Exchange 2024&#xff08;支持30多种文件格式的领先CAD数据转换SDK&#xff09;和HOOPS Publish 2024&#xff0c;用于发布交互式3D PDF、3D HTML和3D CAD数据的领先工具包。 HOOPS Exchange现在支持Navisw…

C++day6

模拟跟随导演去动物园&#xff1a; #include <iostream>using namespace std; class Animal { private:string name; public:Animal(){}Animal(string name):name(name){}virtual void perform(){cout << name << "为我们讲解,说&#xff1a;" &…

php 数组函数

php 数组函数 1. 常用的php数组函数 1. 常用的php数组函数 array_pop() 删除数组中最后一个元素 array_push() 将一个或多个元素插入到数组的末尾 array_keys <?php $arr array("刘岩" > 30, "范冰冰" > 31, "娜扎" > 31);$…

~汉诺塔~(C语言)~

引言 汉诺塔&#xff08;Hanoi Tower&#xff09;&#xff0c;又称河内塔&#xff0c;源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从上面开始按大小顺序重新摆放在…

npm run serve启动报错npm ERR! Missing script: “serve“

启动项目的时候用npm run serve发现报了以下的错误 解决方法&#xff1a; 1.一般情况下&#xff0c;这个问题是因为package.json文件里面确实没有 这里没有可能因为你的脚手架版本比较低&#xff0c;如果不想换&#xff0c;可以用 这里面有的 npm run dev去启动也是可以的 n…

精工电联:定制精工线缆,赋能科技互联---致力于为客户提供卓越的连接线缆和连接器产品

精工电联 “定制精工线缆 &#xff0c;赋能科技互联”&#xff0c;精工电联致力于为高科技产业提供全方位、多维度的集成线缆解决方案。凭借深厚的研发实力和丰富的行业经验&#xff0c;精工电联已经成功地在工控设备、医疗设备、人工智能、新能源领域、轨道交通和超声波设备等…

分享一个学英语的网站

名字叫&#xff1a;公益大米网​​​​​​​ Freerice 这个网站是以做题的形式来记忆单词&#xff0c;题干是一个单词&#xff0c;给出4个选项&#xff0c;需要选出其中最接近题干单词的选项。 答对可以获得10粒大米&#xff0c;网站的创办者负责捐赠。如图 触发某些条件&a…

el-form validator的校验提示遮盖下边的内容

问题&#xff1a;表单的validator校验&#xff0c;无法自动撑起tip提示的高度&#xff0c;导致遮盖了下边内容 解决方式&#xff1a;将tip提示的样式的定位设置为遵循正常的文档流对象&#xff0c;实现自适应高度。 .el-form-item .el-form-item__content .el-form-item__err…

数据库MySQL中出现乱码和表格不对齐怎么解决

MySQL中出现乱码问题及解决办法&#xff1a; 情况类似&#xff1a; 首先进入到数据库中&#xff0c;命令&#xff1a;mysql -h localhost -uroot -p或者mysql -uroot -p;进入数据库后选择一个你的数据库查看表中的中文是否乱码 以上是数据库中表格出现乱码情况&#xff0c;原…

Cesium 问题——加载 gltf 格式的模型之后太小,如何让相机视角拉近

文章目录 问题分析问题 刚加载的模型太小,如何拉近视角放大 分析 在这里有两种方式进行拉近视角, 一种是点击复位进行视角拉近一种是刚加载就直接拉近视角// 模型三加载 this.damModel = new Cesium.Entity({name: "gltf模型",position:</

Redis:常用数据类型及其应用场景

Redis中常见的数据类型有五种&#xff1a;String&#xff08;字符串&#xff09;&#xff0c;Hash&#xff08;哈希&#xff09;&#xff0c;List&#xff08;列表&#xff09;&#xff0c;Set&#xff08;集合&#xff09;、Zset&#xff08;有序集合&#xff09;。下面我来分…