第三阶段 JAVA常见对象的学习

集合框架——Map集合

在实际需求中,我们常常会遇到这样的问题,在诸多的数据中,通过其编号来寻找某一些信息,从而进行查看或者修改,例如通过学号查询学生信息。今天我们所介绍的Map集合就可以很好的帮助我们实现这种需求

(一) 概述及功能

(1) 概述

Map是一种存储元素对的集合(元素对分别称作 键 和 值 也称键值对)它将键映射到值的对象。一个映射不能包含重复的键,并且每个键最 多只能映射到一个值。

怎么理解呢?

键 (key):就是你存的值的编号 值 (value):就是你要存放的数据

你可以近似的将键理解为下标,值依据键而存储,每个键都有其对应值。这两者是1、1对应的

但在之前下标是整数,但是Map中键可以使任意类型的对象。

Map集合和Collection集合的区别?

  • Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的
  • Collection集合存储元素是单独出现的,Collection的子类Set是唯一的,List是可重复的。
  • Map集合的数据结构值针对键有效,跟值无关,Collection集合的数据结构是针对元素有效

(2) 功能

A:添加功能

  1. //添加元素
  2. V put(K key,V value)   
  3. //如果键是第一次存储,就直接存储元素,返回null
  4. //如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值

B:删除功能

  1. //移除所有的键值对元素
  2. void clear()
  3. //根据键删除键值对元素,并把值返回
  4. V remove(Object key)

C:判断功能

  1. //判断集合是否包含指定的键
  2. boolean containsKey(Object key)
  3. //判断集合是否包含指定的值
  4. boolean containsValue(Object value)
  5. //判断集合是否为空
  6. boolean isEmpty()

D:获取功能

  1. //将map集合中的键和值映射关系打包为一个对象
  2. Set<Map.Entry<K,V>> entrySet()
  3. //根据键获取值
  4. get(Object key)
  5. //获取集合中所有键的集合
  6. Set<K> keySet()
  7. //获取集合中所有值的集合
  8. Collection<V> values()

E:长度功能

  1. //返回集合中的键值对的对数
  2. int size()

(二) Map集合的遍历

  1. package cn.bwh_01_iterator;
  2. import java.util.HashMap;
  3. import java.util.Iterator;
  4. import java.util.Map;
  5. import java.util.Set;
  6. public class MapDemo {
  7. public static void main(String[] args) {
  8. Map<String, String> hm = new HashMap<String, String>();
  9. hm.put("bwh002", "i");
  10. hm.put("bwh001", "love");
  11. hm.put("bwh003", "you");
  12. //方式一 键找值
  13. Set<String> set = hm.keySet();
  14. //迭代器遍历
  15. Iterator<String> it = set.iterator();
  16. while (it.hasNext()) {
  17. String key = it.next();
  18. String value = hm.get(key);
  19. System.out.println(key + "---" + value);
  20. }
  21. //增强for遍历
  22. for (String key : set) {
  23. String value = hm.get(key);
  24. System.out.println(key + "---" + value);
  25. }
  26. //方式二 键值对对象找键和值(推荐)
  27. Set<Map.Entry<String, String>> set2 = hm.entrySet();
  28. //迭代器遍历
  29. Iterator<Map.Entry<String, String>> it2 = set2.iterator();
  30. while (it2.hasNext()) {
  31. //返回的是封装了key和value对象的Map.Entry对象
  32. Map.Entry<String, String> entry = it2.next();
  33. String key = entry.getKey();
  34. String value = entry.getValue();
  35. System.out.println(key + "---" + value);
  36. }
  37. //增强for遍历
  38. for (Map.Entry<String, String> me : set2) {
  39. String key = me.getKey();
  40. String value = me.getValue();
  41. System.out.println(key + "---" + value);
  42. }
  43. }
  44. }

(三) Map及子类总结

Map(双列集合)

  • Map集合的数据结构仅仅针对键有效,与值无关。

  • 存储的是键值对形式的元素,键唯一,值可重复

HashMap

  • 底层数据结构是哈希表,线程不安全,效率高

  • 哈希表依赖两个方法:hashCod()和equals()

  • 执行顺序:

    • 首先判断hashCode()值是否相同

      • 是:继续执行equals(),看其返回值

        • 是true:说明元素重复,不添加
        • 是false:就直接添加到集合
      • 否:就直接添加到集合
  • 最终:

  • 自动生成hashCode()和equals()即可

LinkeHashMap

  • 底层数据结构是由链表和哈希表组成

  • 由链表保证元素有序

  • 由哈希表保证元素唯一

Hashtable

  • 底层数据结构是哈希表
  • 哈希表依赖两个......自动生成hashCode()和equals()即可

TreeMap

  • 底层数据结构是红黑树(是一种自平衡的二叉树)

如何保证元素唯一性呢?

  • 根据比较的返回值是否是0来决定

如何保证两种元素的排序呢?

  • 自然排序(元素具备比较性)

    • 让元素所属的类实现comparable接口
  • 比较器排序(集合具备比较性)
    • 让集合接收一个comparator的实现类对象

可以多层嵌套

HashMap集合嵌套HashMap

HashMap集合嵌套ArrayList

ArrayList集合嵌套HashMap

HashMap<String, ArrayList> hm = new HashMap<String, ArrayList>

1:Hashtable和HashMap的区别?

  1. **Hashtable**:线程安全,效率低。不允许null键和null
  2. **HashMap**:线程不安全,效率高。允许null键和null

(其实HashMap就是用来替代Hashtable的,就像ArrayList替代vector一样)

2:List,Set,Map等接口是否都继承子Map接口?

List,Set不是继承自Map接口,它们继承自Collection接口

Map接口本身就是一个顶层接口

需要排序:TreeMap

不需要排序:HashMap

不知道具体需求:HashMap

(四) 经典案例

(1) 统计字符串中字符出现的次数

  1. import java.util.Map;
  2. import java.util.Scanner;
  3. import java.util.Set;
  4. import java.util.TreeMap;
  5. /*
  6. * 案例(统计字符串中字符出现的次数)
  7. * 需求:
  8. * 获取一个字符串出现的次数
  9. * 分析:
  10. * A:定义一个字符串(或者键盘录入)
  11. * B: 定义一个TreeMap集合
  12. * 键:Character
  13. * 值:Integer
  14. * C:把字符串转换为字符数组
  15. * D: 遍历字符数组,得到每一个字符
  16. * E: 拿刚才得到的字符作为键去集合中找,看返回值
  17. * 是 null:说明该键不存在,就把该字符串作为键,1作为值去存储
  18. * 不是 null:说明该键存在,就把值加 1 然后重写存储该键和值
  19. * F: 定义字符串缓冲区变量
  20. * G:遍历集合,得到该建和值,按照要求拼接
  21. * H:最后把字符串缓冲区转换为字符串输出
  22. */
  23. public class CountDemo {
  24. public static void main(String[] args) {
  25. Scanner sc = new Scanner(System.in);
  26. System.out.println("请输入需要统计的数据");
  27. String line = sc.nextLine();
  28. Map<Character, Integer> tm = new TreeMap<Character, Integer>();
  29. char[] chs = line.toCharArray();
  30. for (char ch : chs) {
  31. Integer i = tm.get(ch);
  32. if (i == null) {
  33. tm.put(ch, 1);
  34. } else {
  35. i++;
  36. tm.put(ch, i);
  37. }
  38. }
  39. StringBuilder s = new StringBuilder();
  40. Set<Character> set = tm.keySet();
  41. for (Character key : set) {
  42. Integer value = tm.get(key);
  43. s.append(key).append("(").append(value).append(")" + " ");
  44. }
  45. String result = s.toString();
  46. System.out.println("result: " + result);
  47. }
  48. }
  49. //运行结果
  50. 请输入需要统计的数据
  51. HelloWorld
  52. result: H(1) W(1) d(1) e(1) l(3) o(2) r(1)

(2) 模拟斗地主案例

在讲解这个案例之前,我们先来了解一个我们下面案例中所需要知道的知识点

Collections 工具类

Collections:是针对集合进行操作的工具类,都是静态方法。

面试题:

Collection和Collections的区别?

Collection:是单列集合的顶层接口,有子接口List和Set。(Map是双列的)

Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法

Collections的静态方法

  1. //排序 默认情况下是自然顺序。
  2. public static <T> void sort(List<T> list)
  3. //二分查找
  4. public static <T> int binarySearch(List<?> list,T key)
  5. //最大值
  6. public static <T> T max(Collection<?> coll)
  7. //反转(逆序排序)
  8. public static void reverse(List<?> list)
  9. //随机置换(犹如洗牌,每次运行结果不一样)
  10. public static void shuffle(List<?> list)
  11. 如果同时有自然排序和比较器排序,以比较器排序为主(也就是说,当同时实现了Student类的自然排序(implements Comparable<Student>)以及比较器排序的话(new Comparator<Student>()),比较器排序会覆盖自然排序)
  1. //斗地主案例代码
  2. package cn.bwh_03_PokerGame;
  3. import java.util.*;
  4. public class PokerGame {
  5. public static void main(String[] args) {
  6. HashMap<Integer, String> hm = new HashMap<Integer, String>();
  7. ArrayList<Integer> array = new ArrayList<Integer>();
  8. String[] colors = {"♥", "♠", "♣", "♦"};
  9. String[] numbers = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
  10. int index = 0;
  11. for (String number : numbers) {
  12. for (String color : colors) {
  13. String poker = color.concat(number);
  14. hm.put(index, poker);
  15. array.add(index);
  16. index++;
  17. }
  18. }
  19. hm.put(index, "小王");
  20. array.add(index);
  21. index++;
  22. hm.put(index, "大王");
  23. array.add(index);
  24. index++;
  25. //洗牌
  26. Collections.shuffle(array);
  27. //发牌(发的是编号,为了保证编号是排序的,使用TreeSet接收)
  28. TreeSet<Integer> player1 = new TreeSet<Integer>();
  29. TreeSet<Integer> player2 = new TreeSet<Integer>();
  30. TreeSet<Integer> player3 = new TreeSet<Integer>();
  31. TreeSet<Integer> handcards = new TreeSet<Integer>();
  32. for (int x = 0; x < array.size(); x++) {
  33. if (x >= array.size() - 3) {
  34. handcards.add(array.get(x));
  35. } else if (x % 3 == 0) {
  36. player1.add(array.get(x));
  37. } else if (x % 3 == 1) {
  38. player2.add(array.get(x));
  39. } else if (x % 3 == 2) {
  40. player3.add(array.get(x));
  41. }
  42. }
  43. System.out.println("---------------------欢乐斗地主----------------------");
  44. //看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
  45. lookpocker("player1", player1, hm);
  46. lookpocker("player2", player2, hm);
  47. lookpocker("player3", player3, hm);
  48. lookpocker("预留", handcards, hm);
  49. }
  50. //看牌功能实现
  51. public static void lookpocker(String name, TreeSet<Integer> ts, HashMap<Integer, String> hm) {
  52. System.out.println(name + "的牌是:");
  53. for (Integer key : ts) {
  54. String value = hm.get(key);
  55. System.out.print(value + " ");
  56. }
  57. System.out.println();
  58. }
  59. }

结尾:

如果内容中有什么不足,或者错误的地方,欢迎大家给我留言提出意见, 蟹蟹大家 !_

如果能帮到你的话,那就来关注我吧!(系列文章均会在公众号第一时间更新)

在这里的我们素不相识,却都在为了自己的梦而努力 ❤

一个坚持推送原创Java技术的公众号:理想二旬不止

Java集合框架——Map接口的更多相关文章

  1. Java集合框架Map接口

    集合框架Map接口 Map接口: 键值对存储一组对象 key不能重复(唯一),value可以重复 常用具体实现类:HashMap.LinkedHashMap.TreeMap.Hashtable Has ...

  2. JAVA集合框架 - Map接口

    Map 接口大致说明(jdk11): 整体介绍: 一个将键映射到值的(key-value)对象, 键值(key)不能重复, 每个键值只能影射一个对象(一一对应). 这个接口取代了Dictionary类 ...

  3. java集合框架——Map

    一.概述 1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...

  4. Java集合框架——Set接口

    第三阶段 JAVA常见对象的学习 集合框架--Set接口 List集合的特点是有序的,可重复的,是不是存在这一种无序,且能保证元素唯一的集合呢?(HashSet )这就涉及到我们今天所要讲的Set集合 ...

  5. Java集合框架——List接口

    第三阶段 JAVA常见对象的学习 集合框架--List接口 按照集合框架的继承体系,我们先从Collection中的List接口开始学习 (一) 概述及功能(ArrayList演示) (1) 概述 L ...

  6. Java集合框架之接口Collection源码分析

    本文我们主要学习Java集合框架的根接口Collection,通过本文我们可以进一步了解Collection的属性及提供的方法.在介绍Collection接口之前我们不得不先学习一下Iterable, ...

  7. Java集合——集合框架Map接口

    1.Map接口 public interface Map<K,V>将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.  2.HashMap.Hashtable.Tr ...

  8. Java集合框架顶层接口collectiion接口

    如何使用迭代器 通常情况下,你会希望遍历一个集合中的元素.例如,显示集合中的每个元素. 一般遍历数组都是采用for循环或者增强for,这两个方法也可以用在集合框架,但是还有一种方法是采用迭代器遍历集合 ...

  9. Java集合中Map接口的使用方法

    Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value: Map中的键值对以Entry类型的对象实例形式存在: 建(key值 ...

随机推荐

  1. pyecharts 开发文档

    pyechart 新 版本 https://pyecharts.org/#/zh-cn/quickstart pyecharts 老版本 https://05x-docs.pyecharts.org/ ...

  2. php大文件上传

    PHP用超级全局变量数组$_FILES来记录文件上传相关信息的. 1.file_uploads=on/off 是否允许通过http方式上传文件 2.max_execution_time=30 允许脚本 ...

  3. LibreOJ #6000. 「网络流 24 题」搭配飞行员

    二次联通门 : LibreOJ #6000. 「网络流 24 题」搭配飞行员 /* LibreOJ #6000. 「网络流 24 题」搭配飞行员 二分图最大匹配 Dinic最大流 + 当前弧优化 */ ...

  4. 使用zabbix-proxy

    事情背景: vt上两个vps,只提供ipv6.(因为便宜嘛).而我的zabbix服务器在腾讯云.它丫的没有ipv6. 那么我没法监控它们了呀... 这咋个行呢? 想办法... 我还有另外的vps 可以 ...

  5. Git入门(待更)

    github是什么? 以下截取自百度百科 github: GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub. GitHub 于 ...

  6. c++示例 计算器

    #include <iostream> using namespace std; int main() { char op; float num1, num2; cout << ...

  7. ImportError: No module named rospy

    Traceback (most recent call last): File "manage.py", line 4, in <module> import rosp ...

  8. MySQL 取分组后每组的最新记录

    修改<常用SQL之日期格式化和查询重复数据>中表test1的创建时间,修改后的测试数据如下: 以姓名分组后提取每组最新创建的记录: SELECT a.* FROM test1 AS a, ...

  9. Gym - 100199C

    Gym - 100199C 题意: 其实这么长的英文题面就是想告诉我们这个题是丢手绢. 解法: 找到与 $ N $ 互质的最大整数 $ K $ 即可.当 $ N $ 为奇数时, $ \frac{N-1 ...

  10. Spring框架AOP

    aop技术是面向切面编程思想,作为OOP的延续思想添加到企业开发中,用于弥补OOP开发过程中的缺陷而提出的编程思想.AOP底层也是面向对象:只不过面向的不是普通的Object对象,而是特殊的AOP对象 ...