前言

markdown语法还不是很熟练,就变学习边使用吧。本章节学习了Map集合,其中常见方法通过demo来更深入学习其作用;键值、键值对等等方面找值和遍历;HashMap集合和LinkedHashMap集合的使用。

第一章 Map集合

1.1 概述

像现实生活中遇见的一般: IP 地址与主机名、身份证号与个人、系统用户名与系统用户对象等等一一对应的关系,这类关系就叫做映射。在 JAVA 中提供了专门的集合类用来存放这种对象关系的对象,即 java.util.Map 接口。

Map接口下的集合与Collection接口下的集合存储数据的形式不同。

Map接口 Collection接口
双列集合规范 单列集合规范
Map<K,V> Collection

​ a. Collection中的集合,元素是孤立存在的,向集合中存储元素采用一个个元素的方式存储。

​ b. Collection中的集合称为单列集合,Map中的集合称为双列集合。

​ c. Map中的集合键唯一,值可以重复;键和值一一映射,一个键对应一个值;靠键维护他们的关系。

1.2 Map常用子类

HashMap:存储数据此阿勇的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

LinkHashMap:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈虚标结构可以保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

tips:Map集团口中的集合都有两个泛型变量。在使用时,要为两个泛型变量赋予数据类型(可相同,可不同)。

1.3Map接口中的常用方法

Map接口常用的方法:

​ public V put(K key, V value):把指定的键与指定的值添加到Map集合中。

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

​ public V get(Object key):根据指定的键,在Map集合中获取对应的值。

​ public Set keySet():获取Map集合中所有的键,存储到Set集合中。

​ public Set<Map.Entry<K,V>> entrySet():获取到Map集合中所有的键值对对象的集合(Set集合)。

Map接口的方法演示

import java.util.HashMap;
public class MapDemo {public static void main(String[] args) {// 创建map对象HashMap<String, String> map = new HashMap<>();// 添加元素到集合中map.put("湖人24","科比");map.put("湖人23","詹姆斯");map.put("湖人34","奥尼尔");// {湖人24=科比, 湖人23=詹姆斯, 湖人34=奥尼尔}System.out.println(map);// String remove(String key)System.out.println( "map集合中移除key为湖人34:"+ map.remove("湖人34"));System.out.println(map);    // {湖人24=科比, 湖人23=詹姆斯}// 查看key下的value值System.out.println("map集合中key为湖人24:"+map.get("湖人24"));  // 科比System.out.println("map集合中key为湖人23:"+map.get("湖人23"));  // 詹姆斯}
}

结果演示

{湖人24=科比, 湖人23=詹姆斯, 湖人34=奥尼尔}
map集合中移除key为湖人34:奥尼尔
{湖人24=科比, 湖人23=詹姆斯}
map集合中key为湖人24:科比
map集合中key为湖人23:詹姆斯

tips:

a. 使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中。

b. 若指定的键(key)在集合中存在,则返回值为集合中键对应的值(改值为替换前的值),并把指定键所对应的值,替换成指定的新值。

1.4 Map集合遍历键找值方式

键找值方式:通过元素中的键来获取对应的值。

分析

​ a. 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。keySet()

​ b. 遍历键的Set集合,得到每个键。

​ c. 根据键,获取键所对应的值。get(K key)

代码演示

import java.util.HashMap;
import java.util.Set;public class MapDemo {public static void main(String[] args) {// 创建map对象HashMap<String, String> map = new HashMap<>();// 添加元素到集合中map.put("湖人24","科比");map.put("湖人23","詹姆斯");map.put("湖人34","奥尼尔");// {湖人24=科比, 湖人23=詹姆斯, 湖人34=奥尼尔}System.out.println(map);// 获取键集Set<String> keys = map.keySet();// 遍历键集,得到每个键for (String key : keys) {// key 就是每一个键// 获取key对应的value值String value = map.get(key);System.out.println(key + "是" + value);}}
}

结果演示

湖人24是科比
湖人23是詹姆斯
湖人34是奥尼尔

1.5 Entry键值对对象

Map中存放两种对象,一种称为key(键),一种称为value(值),它们在Map中是一一对应关系,这一堆对象又称做Map中的一个Entry(项)。Entry将键值对的对应关系封装成了对象,即键值对对象。这样就可以在遍历Map集合时,就可以从每个键值对(Entry)对象中获取对应的键与对应的值。

既然Entry表示了一对键和值,那么也同样提供了获取对应和对应的方法:

​ public K getKey():获取Entry对象中的键。

​ public V getValue():获取Entry对象中的值。

在Map集合中也提供了获取所有Entry对象的方法:

​ public Set<Map.Entry<K,V>> entrySet():获取到Map集合中所有的键值对对象的集合(Set集合)。

1.6 Map集合遍历键值对方式

遍历键值对方式:通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。

步骤

​ a. 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。entrySet()

​ b. 遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。

​ c. 通过键值对(Entry)对象,获取Entry对象中的键与值。getkey() getValue()

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo02 {public static void main(String[] args) {// 创建Map集合对象HashMap<String, String> map = new HashMap<>();// 添加元素到map集合中map.put("胡歌","霍建华");map.put("郭德纲","于谦");map.put("詹姆斯","欧文");// 获取所有的Entry对象 entrySet()// Map集合转为Set集合Set<Map.Entry<String, String>> entries = map.entrySet();// 遍历获取每个entry对象for (Map.Entry<String, String> entry : entries) {// 解析获取key valueString key = entry.getKey();String value = entry.getValue();System.out.println(key + "和" + value + "是好搭档。");}}
}

演示结果

詹姆斯和欧文是好搭档。
郭德纲和于谦是好搭档。
胡歌和霍建华是好搭档。

tips:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。

1.7 HashMap存储自定义类型键值

​ a. 当给HashMap中存放自定义对象时,若自定义对象作为key存在,这时要保证对象唯一,且必须复写对象的hashCode()和equals()方法。

​ b. 若要保证map中村阿芳的key和取出的顺序一致,可以使用java.util.LinkedHashMap集合来存放。

练习

​ 每个学生(姓名、年龄)都有自己的家庭住址。将学生对象和家庭住址存储在map集合中。学生为键,家庭住址为值。

学生类

import java.util.Objects;
public class Student {private String name;    // 姓名private int age;        // 年龄// Constructorpublic Student() {}public Student(String name, int age) {this.name = name;this.age = age;}// Getter & Setterpublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// 重写hashCode() 和 equals()@Overridepublic int hashCode() {// return super.hashCode();return Objects.hash(name,age);}@Overridepublic boolean equals(Object obj) {// return super.equals(obj);if (this == obj)return true;// 非空验证if (obj == null || getClass() != obj.getClass())return false;Student student = (Student) obj;return age == student.age && Objects.equals(name,student.name);}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

测试类

import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class HashMapTest {public static void main(String[] args) {// 创建HashMap对象HashMap<Student, String> map = new HashMap<>();// 添加元素// Student对象,地址map.put(new Student("张三",15),"福建");map.put(new Student("李四",13),"浙江");map.put(new Student("李四",13),"北京");map.put(new Student("王五",16),"广东");// 1.取出元素 键找值 key -> value// Map -> SetSet<Student> keySet = map.keySet();for (Student key : keySet) {String value = map.get(key);System.out.println(key.toString() + "--" + value);}System.out.println("-------分割线-------");// 2.通过键值对对象来获取key和valueSet<Map.Entry<Student,String>> entrySet = map.entrySet();for (Map.Entry<Student, String> entry : entrySet) {// 解析 key valueStudent key = entry.getKey();String value = entry.getValue();System.out.println(key.toString() + "--" + value);}}
}

演示结果:(Key唯一)

Student{name='王五', age=16}--广东
Student{name='张三', age=15}--福建
Student{name='李四', age=13}--北京
-------分割线-------
Student{name='王五', age=16}--广东
Student{name='张三', age=15}--福建
Student{name='李四', age=13}--北京

tips:

存入集合的key有相同的后面的会覆盖前面的元素。如上述数据中学生:李四,13岁。第一次存入的是浙江,后面更新为北京的,打印结果为后者。

1.8 LInkedHashMap

​ HashMap保证成对元素唯一,并且查询速度很快。但是成对元素存放进去是没有顺序的,那么如何保证有序,还要速度快?

​ 在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;public class LinkedHashMapDemo {public static void main(String[] args) {// 创建linkedHashMap对象LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<String, String>();// 添加元素linkedHashMap.put("邓超","孙俪");linkedHashMap.put("周星驰","朱茵");linkedHashMap.put("贾乃亮","李小璐");// 键值对对象来获取key valueSet<Map.Entry<String,String>> entrySet = linkedHashMap.entrySet();for (Map.Entry<String, String> entry : entrySet) {String key = entry.getKey();String value = entry.getValue();System.out.println(key + "--" + value);}}

结果演示

邓超--孙俪
周星驰--朱茵
贾乃亮--李小璐

1.9 Map集合练习

需求:
计算一个字符串中每个字符出现次数。
分析:

  1. 获取一个字符串对象
  2. 创建一个Map集合,键代表字符,值代表次数。
  3. 遍历字符串得到每个字符。
  4. 判断Map中是否有该键。
  5. 如果没有,第一次出现,存储次数为1;如果有,则说明已经出现过,获取到对应的值进行++,再次存储。
  6. 打印最终结果
import java.util.HashMap;
import java.util.Scanner;public class MapTest {public static void main(String[] args) {// 键盘录入一个字符串System.out.println("请录入一个字符串:");String str = new Scanner(System.in).nextLine();// 调用查看每个字符出现次数的方法findChar(str);}private static void findChar(String str) {// 创建一个集合 存储字符key 和 出现次数valueHashMap<Character,Integer> hashMap = new HashMap<>();// 遍历字符串for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);// 判断是否是第一次出现if (!hashMap.containsKey(c))hashMap.put(c,1);else {// 不是第一次出现,就要获取次数 进行累加Integer count = hashMap.get(c);// 更新hashMap.put(c,++count);}}System.out.println(hashMap);}
}

演示结果

请录入一个字符串:
ajdkflajkdfja8iuiuuiouio
{a=3, d=2, u=4, f=2, 8=1, i=4, j=3, k=2, l=1, o=2}

天生双子星——Map集合相关推荐

  1. Java中的Map集合遍历总结(详尽版)

    因为Map集合中的键值对排列无序,所以不能用传统的for循环来遍历,只能使用加强循环(for-each)和迭代器进行遍历. 让我们通过例子来了解Map集合的遍历: package gather; im ...

  2. 安卓取map集合转换为json_android json解析成map格式

    "discount": { "3": "34", "4": "33", "5": ...

  3. Map集合中value()方法与keySet()、entrySet()区别 ——转载

    为什么80%的码农都做不了架构师?>>>    在Map集合中 values():方法是获取集合中的所有的值----没有键,没有对应关系, KeySet(): 将Map中所有的键存入 ...

  4. java map 队列_Java:queue队列,map集合

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List.Set同一级别,都是继承了Collection接口.Lin ...

  5. 8.Map集合(HashMapTreeMap)

    一.Map集合概述和使用 1.Map集合概述 Interface Map<K,V> K:键的类型 V:值的类型 将键映射到值的对象:不能包含重复的键:每个键可以映射到最多一个值 创建Map ...

  6. Map集合练习之对字符串中字母出现的次数求和

    代码需求 如有这么一个字符串 String str = "fdg+avAdc bs5dDa9c-dfs"; MapTest.java package zhouls.bigdata. ...

  7. 【mybatis】mybatis中 返回map集合

    关于mybatis返回map集合的操作: 1.mapper.xml中写一个查询返回map的sql <select id="findMap" parameterType=&qu ...

  8. Map集合的遍历(java)

    2019独角兽企业重金招聘Python工程师标准>>> Map集合通过entrySet 和 keySet都可以使用迭代器 以及for循环拿到key和value: import jav ...

  9. java map key是否存在_java中如何判断map集合中是否存在key

    有两种方法可以判断map集合中是否存在某个key. 方法1:直接使用java api提供的containsKey(): 方法2:循环遍历,逐个比较. java相关视频推荐:java视频 具体实现代码如 ...

最新文章

  1. Wireshark网络抓包(三)——网络协议
  2. 【c++】重载操作符
  3. 查看.Net Framework版本号
  4. 【1】ASP.NET异步(1)
  5. 算法导论之平摊分析(动态表)
  6. 浏览器时间久了重新登录_注意!今日开始打印一建准考证,附各地时间及常见问题汇总...
  7. Ansible script模块使用示例
  8. []==![]为true
  9. java mvc中重复提交_SpringMVC之——防止重复提交表单的方法(一)
  10. 信息学奥赛C++语言: 小明的步行
  11. android系统优化(17)---高通平台性能优化概述
  12. zabbix之 qq邮件报警
  13. Android技术精髓-Bitmap详解
  14. VGG16(pytorch自带的) + CIFAR10
  15. 大华出入口管理系统H710服务器配置,DH-DSS-H710S2 大华出入口综合管理系统 人员车辆管理车场收费...
  16. Tecplot自定义变量
  17. PMP笔记(三)之项目整合管理
  18. MATLAB算法实战应用案例精讲-【图像处理】缺陷检测(补充篇)(附matlab实现代码)
  19. 道阻且长,行则将至,行而不辍,未来可期
  20. ubuntu 20.4下服务器部署

热门文章

  1. [游戏技术] Stripper:source地图事件说明
  2. 总是空驶、排队等货怎么办?货运要想网络化,运力画像看一看!
  3. CC2640蓝牙丢包问题(notify发送返回0x16:blePending)
  4. stm32读取目标芯片_STM32通过IIC读取MPU6050陀螺仪芯片数据核心程序
  5. 【PostgreSQL】GIN索引安装与使用 - 全模糊匹配/数组匹配,PG批量插入上万随机生成数据,随机生成字符串/数组
  6. 算法设计和分析课程设计报告
  7. ARM架构下银河麒麟V10系统基于CUDA11.8编译PyTorch
  8. 【书评】《你好哇,程序员——漫话程序员面试求职、升职加薪、创业与生活》...
  9. EtherCat伺服驱动与上位机及PLC之间通讯的那些问题
  10. linux c int16进制转10进制,[编程题] 进制转换(16进制转10进制)