【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;在…

Flutter 中 DraggableScrollableSheet 的属性介绍与使用

在 Flutter 中&#xff0c;DraggableScrollableSheet 是一个非常有用的小部件&#xff0c;它允许用户通过手势来拖动一个可滚动的区域&#xff0c;通常被用作底部弹出式面板或者随手势拖动的控件。本文将介绍 DraggableScrollableSheet 的属性以及如何在 Flutter 中使用它。 D…

SpringBoot整理-错误处理

在Spring Boot中处理错误通常涉及几个关键方面,包括异常处理和自定义错误响应。以下是一些常见的做法: 1. 全局异常处理 (@ControllerAdvice 和 @ExceptionHandler) @ControllerAdvice: 这是一个全局异常处理器,可以处理多个控制器抛出的异常。你可以在这个类中定义多个方法…

day6:继承与多态

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

【实战】二、Jest难点进阶(三) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(七)

文章目录 一、Jest 前端自动化测试框架基础入门二、Jest难点进阶3.mock timers 学习内容来源&#xff1a;Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程&#xff0c;我在学习开始时&#xff08;2023.08&#xff09;采用的是当前最新版本&#xff1a; 项版本babel/core…

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

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

数组相关题目总结

33.搜索旋转排序数组 这题如果数组不进行循环平移那用二分做就很简单&#xff0c;平移后其实也可以用二分做&#xff0c;重点在于二分里面如何check。平移后数组可以分成两段各自升序的数组&#xff0c;并且第一段值大于第二段值。check的时候分两种情况&#xff0c;一种是tar…

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

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

【二维比较函数】有n个区间,对于每个区间,求该区间与其他区间的相交的最小值

题目 #include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn = 1e6 + 5, inf = 1e18 + 5, maxm = 4e4 + 5, mod = …

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…

返乡创业者:直播电商-连州农产品的新舞台

摘要&#xff1a;在广东省连州市&#xff0c;“连州年味直播争霸赛”为返乡创业者提供了展示才华的平台&#xff0c;将农特产品的故事传达给全国消费者。返乡创业者通过直播电商模式&#xff0c;挑战旧有销售渠道的局限性&#xff0c;探索农产品从田间到餐桌的新路径。 正文&a…

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

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

P1106 删数问题题解

题目 键盘输入一个高精度的正整数N&#xff08;不超过250位&#xff09;&#xff0c;去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的N和k&#xff0c;寻找一种方案使得剩下的数字组成的新数最小。 输入输出格式 输入格式 输入两行正整数…

图像处理与计算机视觉算法

图像处理与计算机视觉算法是实现对图像和视频内容分析、理解和操作的一系列技术。这些算法可以分为多个类别,包括但不限于以下几个主要方面: 预处理: 像素操作:灰度化、二值化、直方图均衡化等,用于改善图像的对比度和亮度分布。去噪:高斯滤波、中值滤波、自适应滤波等,…

【C++搜索】DFS:拆分自然数

题目描述 “天下熙熙&#xff0c;皆为利来&#xff1b;天下攘攘&#xff0c;皆为利往”&#xff0c;监狱里的暗势力划分地盘的目的无非是为了获取利益&#xff0c;他们分配利益的方式是基于这样一个准则&#xff1a;设总利益为自然数&#xff2e;&#xff0c;则任何一个大于1的…

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;" &…