入门Java编程的知识点—>Map(day18)

  • 了解掌握什么是map?
  • 重点掌握map的存储结构以及使用?
Map接口
2.1 概述

Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的键(key)另外一组值用于保存Map里的值(value),键和值是一一对应的关系,称为映射。根据键就能找到对应的值,类似于生活中一张身份证对应一个人一样。

Map的key和value可以是任何引用类型的数据,其中key不允许重复,同一个Map对象的任何两个key通过equals方法比较总是返回false。

2.2 特点
  1. Map集合中每个元素都有两个值, 分别是key(键) 和 value(值)
  2. Map集合中的key(键)不允许重复, 在第二次添加已有的key时, value会被会覆盖、
  3. Map集合中的元素是无序的(即元素存入集合的顺序和取出时的顺序很可能不一致)
  4. Map集合中的key和value具有映射关系, 可以通过key(键)来获取对应的value(值)

key和value之间存在单向一对一关系,即通过指定的key,总能找到唯一的、确定的value。从Map中取出数据时,只要给出指定的key,就可以取出对应的value。

如果把Map里的所有key放在一起来看,它们就组成了一个Set集合(所有的key没有顺序,key与key之间不能重复),实际上Map确实包含了一个keySet()方法,用于返回Map里所有key组成的Set集合。

如果把Map里的所有value放在一起来看,它们又非常类似于一个List:元素与元素之间可以重复,每个元素可以根据索引来查找,只是Map中的索引(也就是key)不是从0开始的整数值,而是任意类型的对象;

如果需要从List集合中取出元素,则需要提供该元素的数字索引;如果需要从Map中取出元素,则需要提供该元素的key。因此,Map有时也被称为字典,或关联数组。

2.3 继承结构
Map接口
  • HashMap类

解释说明:

- Map集合是采用键-值对(key-value)的存储方式, 键(key)、值(value)可以是引用类型的数据, key不允许重复, vaue可以重复, key和value是一对一的关系, 通过指定的key总能找到唯一的、确定的value值

- HashMap 和 Hashtable 都是Map接口的实现类,它们之间的关系完全类似于ArrayList和Vector的关系

  1. HashMap是线程不安全的, 所以HashMap的性能要比HashTable高一些
  2. HashMap可以使用null作为key或value
2.4 MapDemo
package map;

import java.util.HashMap;
import java.util.Map;

/**
* java.util.Map接口 查找表
* Map体现的结构是一个多行两列的表格,其中左列称为key,右列称为value
* Map总是一个key-value的形式保存一组数据,并且可以根据key获取对应的value,
* Map有一个要求,key不允许重复
* 常用的类:
* java.util.HashMap 我们称为"散列表",当今查询速度最快的数据结构
*/
public class MapDemo {
   public static void main(String[] args) {
       //创建一个Map实例,也可以使用泛型,只不过指定泛型时,需要指定key和value的泛型
       Map<String, Integer> map = new HashMap<>();
       //向map中存储一组键值对 V put(K k,V v)
       map.put("语文", 100);
       map.put("数学", 90);
       map.put("物理", 80);
       Integer v = map.put("化学", 88);
       System.out.println(v);//null
       //{物理=80, 数学=90, 化学=88, 语文=100}
       System.out.println(map);
       //此时map中已经存在key=化学的键值对,此时再存储重复的key的键值对时,会将原先的value进行覆盖
       //并且put方法会将覆盖的value值作为返回值进行返回
       v = map.put("化学", 98);
       System.out.println(v);//88
       System.out.println(map);
       //根据指定的key值,获取对应的value  V get(K k)
       v = map.get("化学");
       System.out.println(v);
       v = map.get("语文");
       System.out.println(v);
       //获取当前map中键值对的个数
       int size = map.size();
       System.out.println("map中的元素数:" + size);
       //删除给定的key对应的这组键值对,返回值为这个key对应的value
       v = map.remove("物理");
       System.out.println(v);
       System.out.println(map);
       //可以判定Map中是否包含给定的key或者value
       boolean ck = map.containsKey("英文");
       System.out.println(ck);
       boolean cv = map.containsValue(98);
       System.out.println(cv);
   }
}
2.5 MapDemo2
package map;

import java.util.*;

/**
* Map遍历
* Map支持三种遍历方式:
* 1:单独遍历key
* 2:遍历每一组键值对
* 3:单独遍历value(这个操作不常用)
*/
public class MapDemo2 {
   public static void main(String[] args) {
       Map<String, Integer> map = new HashMap<>();
       map.put("语文", 100);
       map.put("数学", 90);
       map.put("物理", 80);
       map.put("化学", 60);
       map.put("体育", 120);
       System.out.println(map);
       /*
        * map中存储的key是不允许重复的(Set集合存储不重复的元素)
        * keySet() 当前的map中的所有的key存储进一个Set集合
        */
       Set<String> keySet = map.keySet();
       for (String s : keySet) {
           System.out.println(s);
       }
       System.out.println("================================");
       /*
        * map底层键值对其实是由一个entry对象存储的
        * 也就是获取map中所有的键值对,就是获取所有的entry
        * map中提供了一个方法entrySet()
        * 这个方法可以将map中所有的entry封装到一个Set集合
        */
       Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
       for (Map.Entry<String, Integer> entry : entrySet) {
           //entry对象提供了getKey方法和getValue方法,获取entry中的key和value
           System.out.println("键:" + entry.getKey());
           System.out.println("值:" + entry.getValue());
       }
       System.out.println("========================");
       /*
        * map中的value值是允许重复 (Collection集合可以存储重复元素)
        */
       Collection<Integer> values = map.values();
       for (Integer value : values) {
           System.out.println(value);
       }
       
        map.forEach(
               new BiConsumer<String, Integer>() {
                   @Override
                   public void accept(String k, Integer v) {
                       System.out.println("匿名内部类:" + k + ":" + v);
                   }
               }
       );
       map.forEach((String k, Integer v) ->
               System.out.println("匿名内部类:" + k + ":" + v)
       );
       map.forEach(( k,v) -> System.out.println("lambda:" + k + ":" + v));
       
       
   }
}

上篇文章:入门Java编程的知识点—>集合(day17)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Z0412_J0103/article/details/141554223下篇文章: 入门Java编程的知识点—>socket的使用(day19)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Z0412_J0103/article/details/141590311

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值