java学习之高级语法(十三)------ Map集合

简介: java学习之高级语法(十三)------ Map集合

 Map集合

java.util.Map<k,v>集合

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

image.gif编辑

▶  Map集合的特点:

(1)Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)

(2)Map集合中的元素,key和value的数据类型可以相同也可以不同

(3)Map集合中的元素,key是不允许重复的,value是可以重复的

(4)Map集合中的元素,key和value是一一对应的

【 这里的Map集合和python中的字典很像】

▶  Map接口最常用的两个实现类 --- HashMap 和 LinkedHashMap

java.util.HashMap<k , v>集合  implements  Map<k, v>接口

HashMap集合的特点:

(1)HashMap集合底层是哈希表:查询速度非常快

        JDK1.8 之前:数组+单向链表

        JDK1.8 之后:数组+单向链表/红黑树(链表长度超过8):提高查询速度

(2)HashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致

java.util.LinkedHashMap<k, v>集合  extends  HashMap<k, v>集合

LinkedHashMap的特点:

(1)LinkedHashMap集合底层是哈希表+链表(链表的作用是保证迭代的顺序)

(2)LinkedHashMap集合是一个有序集合,存储元素和取出元素的顺序是一致的

▶ Map接口中的常用方法

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

   返回值V:存储键值对的时候,key不重复,返回值v是null

                    存储键值对的时候,key重复,会使用新的value替换map中重复的value,返回被替换的value值

               image.gif编辑

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

    返回值V:key存在,v返回被删除的值

                     key不存在,v返回null

                image.gif编辑

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

   返回值:key存在,v返回对应的value值

                 key不存在,v返回null

            image.gif编辑

--- boolean containsKey(Object key) :判断集合中是否包含指定的键

    返回值:包含指定的键返回true,不包含指定的键返回false

              image.gif编辑

▶  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集合)

▶  Map集合的遍历方式

   1. 通过键找值的方式

        Map集合中的方法:Set<K> keySet()  --- 返回此映射中包含的键的Set视图

        实现步骤:

                (1)使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中

                (2)遍历Set,获取Map集合中的每一个key

                (3)通过Map集合中的方法get(key),通过key找到value              

         image.gif编辑

 

   2. 通过Entry对象遍历

       Map集合中的方法:public Set<Map.Entry<K,V>> entrySet()  返回此映射中包含的映射关系的Set视图

       实现步骤:

           (1)使用Map集合中的方法entrySet() ,把Map集合中多个Entry对象取出来,存储到一个Set集合中

           (2)遍历Set集合,获取每一个Entry对象

           (3)使用Entry对象中的方法getKey() 和 getValue()获取键与值

                                    image.gif编辑

▶  HashMap存储自定义类型键值

         image.gif编辑

▶  LinkedHashMap集合

java.util.LinkedHashMap<K,V> extends  HashMap<K,V>

Map接口的哈希表和链接列表实现,具有可预知的迭代顺序

底层原理:    哈希表+链表(记录元素的顺序)

image.gif编辑

运行结果:   image.gif编辑

▶  Hashtable集合

java.util.Hashtable<K,V>集合  implements  Map<K,V>接口

Hashtable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢

HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快

HashMap集合可以存储null值,null键(之前学的所有的集合都可以)

Hashtable集合不能存储null值,null键

Hashtable 和 Vector集合一样,在jdk1.2版本之后被更加先进的集合(HashMap,ArrayList)取代了

Hashtable 的子类Properties依然活跃在历史舞台

Properties集合是一个唯一和IO流相结合的集合

Map集合练习

题目:计算一个字符串中每个字符出现的次数

分析

1. 使用Scanner获取用户输入的一个字符串

2. 遍历字符串,获取每一个字符

  (1)String类的方法toCharArray,把字符串转换为一个字符数组,遍历数组

  (2)String类的方法length()+charAt(索引)

3. 使用Map集合中的方法判断获取到的字符是否存储在Map集合中

(1)使用Map集合中的方法containsKey(获取到的字符),返回的是boolean值

         true:字符存在

                   通过字符(key)获取value(统计个数)

                   把value++

                   再把新的value存储到Map集合中

         false:字符不存在

                    把字符作为key,1作为value存储到Map集合中

(2)使用Map集合的get(key)

          返回null,key不存在

          返回的不是null,key存在

代码

image.gif编辑

JDK9对集合添加的优化

image.gif编辑

Debug追踪

Debug调试程序: 可以让代码逐行执行,查看代码执行的过程,调试程序中出现的bug

使用方式:

(1)在行号的右边,鼠标左键单击,添加断点(每个方法的第一行(新手),哪里有bug添加到哪里(以后))

(2)右键选择Debug执行程序,程序就会停留在添加的第一个断点处

斗地主综合案例(双列)

image.gif编辑

【 注:图中的soft写错了,应该是sort方法排序 】

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
/*
    斗地主综合案例:有序版本
    1. 准备牌
    2. 洗牌
    3. 发牌
    4. 排序
    5. 看牌
 */
public class DouDiZhu {
  public static void main(String[] args) {
    /*准备牌: 
                   创建Map集合,存储牌的索引和组装好的牌
                   创建一个List集合,存储牌的索引
     */
    HashMap<Integer,String> poker  = new HashMap<>() ;
    ArrayList<Integer> pokerIndex = new ArrayList<>() ;
      List<String> colors = List.of("♠","♥","♣","♦");
      List<String> numbers = List.of("2","A","K","Q","J","10","9","8","7","6","5","4","3");
      // 把大王小王存储到集合中
      // 定义一个牌的索引
      int index = 0;
      poker.put(index,"大王");
      pokerIndex.add(index);
      index++;
      poker.put(index,"小王");
      pokerIndex.add(index);
      index++;
      // 循环嵌套遍历两个集合组装52张牌,存储到集合中
      for(String number:numbers) {
        for(String color:colors) {
          poker.put(index,color+number);
          pokerIndex.add(index);
          index++;
        }
      }
      //System.out.println(poker);
      //System.out.println(pokerIndex);
      /*
        2.洗牌
                 使用Collections中的方法shuffle(List)
       */
      Collections.shuffle(pokerIndex);
      /*
        3.发牌
                 定义4个集合,存储玩家牌的索引和底牌的索引
       */
      ArrayList<Integer> player1 = new ArrayList<>();
      ArrayList<Integer> player2 = new ArrayList<>();
      ArrayList<Integer> player3 = new ArrayList<>();
      ArrayList<Integer> dipai = new ArrayList<>();
      // 遍历存储索引的List集合,获取每一个牌的索引
      for(int i=0;i<pokerIndex.size();i++) {
        Integer in = pokerIndex.get(i);
        // 先判断底牌
        if(i>=51) {
          // 给底牌发牌
          dipai.add(in);
        }else if(i%3==0) {
          // 给玩家1发牌
          player1.add(in);
        }else if(i%3==1) {
          // 给玩家2发牌
          player2.add(in);
        }else if(i%3==2) {
          // 给玩家3发牌
          player3.add(in);
        }
      }
    /*
       4.排序
          使用Collections中的方法sort(list)
          默认是升序排序 
     */
      Collections.sort(player1);
      Collections.sort(player2);
      Collections.sort(player3);
      Collections.sort(dipai);
      /*
         5.看牌
                  调用看牌的方法
       */
      lookPoker("刘德华",poker,player1);
      lookPoker("周润发",poker,player2);
      lookPoker("古天乐",poker,player3);
      lookPoker("底牌",poker,dipai);
  }
  /*
     定义一个看牌的方法,提高代码的复用性
     参数:
          String name :玩家名称
          HashMap<Integer,String> poker:存储牌的poker集合
          ArrayList<Integer> list:存储玩家和底牌的list集合
     查表法:
               遍历玩家或者底牌集合,获取牌的索引
               使用牌的索引去Map集合中,找到对应的牌
   */
   public static void lookPoker(String name, HashMap<Integer,String> poker,ArrayList<Integer> list) {
     // 输出玩家的名称,不换行
     System.out.print(name+":");
     // 遍历玩家或者底牌集合,获取牌的索引
     for(Integer key:list) {
       // 使用牌的索引,去Map集合中找到对应的牌
       String value = poker.get(key);
       System.out.print(value+"  ");
     }
     System.out.println();
   }  
}

image.gif


相关文章
|
27天前
|
Java API Maven
2025 Java 零基础到实战最新技术实操全攻略与学习指南
本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
271 1
|
1月前
|
数据采集 搜索推荐 Java
Java 大视界 -- Java 大数据在智能教育虚拟学习环境构建与用户体验优化中的应用(221)
本文探讨 Java 大数据在智能教育虚拟学习环境中的应用,涵盖多源数据采集、个性化推荐、实时互动优化等核心技术,结合实际案例分析其在提升学习体验与教学质量中的成效,并展望未来发展方向与技术挑战。
|
2月前
|
并行计算 Java API
Java 基础篇完整学习攻略
本教程涵盖Java基础到高级内容,包括模块化系统、Stream API、多线程编程、JVM机制、集合框架及新特性如Records和模式匹配等,适合零基础学员系统学习Java编程。
73 0
|
2月前
|
前端开发 Java API
新手 Java 学习资料结合最新技术的精选推荐及高效学习资源参考
本文为新手推荐了涵盖Java基础到最新技术的学习资料,包括官方文档、在线课程、书籍、学习网站及实践平台,帮助系统掌握Java编程,并通过Spring Boot实战提升开发能力。
115 1
|
2月前
|
NoSQL Java 数据库
Java 全栈学习超全面知识图谱构建完整 Java 知识体系
本文全面讲解Java核心技术体系,涵盖基础语法、面向对象、集合框架、主流框架(Spring、Spring Boot、MyBatis)及三大实战项目(微服务电商、响应式博客、企业后台系统),助你系统掌握Java全栈开发技能。
179 1
|
2月前
|
存储 算法 安全
JAVA 八股文全网最详尽整理包含各类核心考点助你高效学习 jAVA 八股文赶紧收藏
本文整理了Java核心技术内容,涵盖Java基础、多线程、JVM、集合框架等八股文知识点,包含面向对象特性、线程创建与通信、运行时数据区、垃圾回收算法及常用集合类对比,附有代码示例与学习资料下载链接,适合Java开发者系统学习与面试准备。
685 0
|
1月前
|
存储 搜索推荐 安全
Java 大视界 --Java 大数据在智能教育学习效果评估与教学质量改进中的应用(209)
本文探讨了 Java 大数据在智能教育中的创新应用,涵盖学习效果评估、教学质量改进及个性化教学方案定制等内容,结合实战案例与代码解析,展现技术如何赋能教育智能化转型。
|
3月前
|
前端开发 Java 数据库
2025 年 Java 学习完整步骤及详细路线指南
本教程涵盖Java从基础到高级的完整学习路径,包括环境配置、语法基础、面向对象编程、集合框架、多线程、网络编程、数据库操作、Spring Boot、微服务架构及项目实战。通过系统学习与实操,助你全面掌握Java核心技术与企业级应用开发。
510 1
|
3月前
|
Oracle Java 关系型数据库
java 入门学习视频_2025 最新 java 入门零基础学习视频教程
《Java 21 入门实操指南(2025年版)》提供了Java最新特性的开发指导。首先介绍了JDK 21和IntelliJ IDEA 2025.1的环境配置,包括环境变量设置和预览功能启用。重点讲解了Java 21三大核心特性:虚拟线程简化高并发编程,Record模式优化数据解构,字符串模板提升字符串拼接可读性。最后通过图书管理系统案例,展示如何运用Record定义实体类、使用Stream API进行数据操作,以及结合字符串模板实现控制台交互。该指南完整呈现了从环境搭建到实际项目开发的Java 21全流程实
111 1
|
3月前
|
Java
银行转账p图软件,对公转账截图生成器,java版开发银行模拟器【仅供学习参考】
这是一套简单的银行账户管理系统代码,包含`BankAccount`和`BankSystem`两个核心类。`BankAccount`负责单个账户的管理

热门文章

最新文章