学习任务:

视频学习

键值对映射介绍

Map接口介绍

Map是一个接口,它表示一个键值对映射的数据结构,首先打开源代码查看,如下:

public interface Map<K,V> {
	//将一个键值对加入集合
	V put(K key, V value);
	//根据键取出对应的值
	V get(Object key) ;
	//将键值对组成一个集合返回
    Collection<V> values();
    ...
}

Map接口的泛型参数包括:K和V,K表示键,全称为key,V表示值,全称为value。

键值对映射表示一个key对应一个value,由key映射(对应)到value。相比Collection它是双列的,所以它也叫双列集合。

业务上很多需求都用到键值对的数据结构,如下是课程编号和课程对象的映射关系:

image-20201015171157940

这是一个课程信息的键值对映射结构:

1)课程编号为key,课程信息对象为value。

2)一个key对应一个value,key不允许重复,value可以重复(实际上每条记录表示一门课程,value不会重复)。

类似的键值对结构的数据有很多,比如:学号对应学生,身份证号对应一个公民等。

键值对结构有什么好处呢?

1)符合根据身份操作对象的业务场景

键相当于身份,根据身份去存储或查询对象的场景有很多,比如:根据学号查询一名学生,根据身份证号查询一名公民信息。

这种业务场景使用List是无法满足需求的。

2)天然的唯一性约束

键值对结构中的键就是身份,身份就有唯一性,所有键值对结构会保证键的唯一性。

3)键支持面向对象

虽然更多的身份用一个数字或一个字符串表示,其实键可以是一个对象类型。

键和值都可以是一个自定义的类型,满足更多业务场景的需求。

Map接口的部分方法如下:

// 添加元素,返回值代表的是上一次该键所对应的值
V   put(K key , V  value)		
// 根据键获取值
V get(Object key)
// 获取所有值的集合
Collection<V>  values()				
// 根据键删除键值对元素,返回值表示被删除的键所对应的值
V   remove(Object key)			
// 移除所有的键值对元素
void   clear()			
// 判断集合是否包含指定的键,通过equals方法来判断相等
boolean containsKey(Object key)		
// 判断集合是否包含指定的值,通过equals方法来判断相等
boolean containsValue(Object value)	
// 判断集合是否为空
boolean isEmpty()		
// 集合的长度,也就是集合中键值对的个数
int size()								

在集合章节会讲解两个常用的Map实现类:TreeMap和HashMap,它们两个的底层实现不一样,应用场景也不同,TreeMap是一个天然有序的集合,底层采用红黑树实现,HashMap底层是哈希表结构,适用于大数据量且快速查找的应用领域,稍后对每种实现类的原理进行分析,本小节主要是学习key/value结构,下边使用TreeMap实现类来测试Map接口。

package com.pbteach.javase.pop.map.test1;

import com.pbteach.javase.oop.arraylist.test2.PbCourse;

import java.util.Collection;
import java.util.Map;
import java.util.TreeMap;

/**
 * treeMap入门测试
 *
 * @author 攀博课堂(www.pbteach.com)
 */
public class TreeMapTest1 {


    public static void main(String[] args) {
        test1();
    }

    public static void test1() {
        //创建一个map,key和value都是Integer
        Map<Integer, Integer> map = new TreeMap<>();
        //放入10个整数,key从1开始依次累加,value值是key的平方
        for (int i = 1; i <=10; i++) {
            map.put(i,i*i);
        }
        //查询元素的个数
        System.out.println("size="+map.size());
        //根据key取出value
        System.out.println("key=100,value="+map.get(10));
        System.out.println("key=101,value="+map.get(11));//返回null
        //判断key是否存在
        System.out.println(map.containsKey(10));
        //遍历所有
        foreash1(map);
        foreash2(map);
        //根据key删除
        map.remove(10);
        System.out.println(map.containsKey(10));
        foreash2(map);
        //清楚所有
        map.clear();
        System.out.println("size="+map.size());
        //判断是否为空
        System.out.println(map.isEmpty());
    }
    //遍历集合所有元素
    public static void foreash1(Map<Integer, Integer> map){
        System.out.println("============遍历map所有元素=============");
        for (int i = 1; i <=10; i++) {
            System.out.println("key="+i+",value="+map.get(i));
        }
    }
    public static void foreash2(Map<Integer, Integer> map){
        System.out.println("============遍历map所有元素=============");
        map.forEach((key,value)-> System.out.println("key="+key+",value="+value));
    }

    
}

输出:

size=10
key=100,value=100
key=101,value=null
true
============遍历map所有元素=============
key=1,value=1
key=2,value=4
key=3,value=9
key=4,value=16
key=5,value=25
key=6,value=36
key=7,value=49
key=8,value=64
key=9,value=81
key=10,value=100
============遍历map所有元素=============
key=1,value=1
key=2,value=4
key=3,value=9
key=4,value=16
key=5,value=25
key=6,value=36
key=7,value=49
key=8,value=64
key=9,value=81
key=10,value=100
false
============遍历map所有元素=============
key=1,value=1
key=2,value=4
key=3,value=9
key=4,value=16
key=5,value=25
key=6,value=36
key=7,value=49
key=8,value=64
key=9,value=81
size=0
true

提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题