注册 登录
Java基础教程

第一章: 开启Java学习之旅

第二章: 掌握计算机基础知识

第三章: 掌握命令行基础知识

第四章: 我的第一个Java程序

第五章: Java编程必备基础

第六章: Java编程的核心:控制结构

第七章: Java面向对象基础

第八章: Java面向对象进阶

第九章: Java字符串类型

第十章: Java数组与数据结构

第十一章: Java高级数据结构

第十二章: Java并发编程基础

首页 > Java基础教程 > 第十一章: Java高级数据结构 > 11.3节: Map容器

11.3节: Map容器

薯条老师 2021-12-30 11:05:36 146364 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师的线下Python小班办得很好,学员的平均就业薪资有11K。线下小班培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

11.3.1 键值对映射结构

本节要学习的Map容器是一种键值对的映射结构。在日常生活中,我们经常会接触到这种键值对的映射结构,例如一本书籍的目录结构,在目录结构中,通过查找特定章节的页码,就可以快速翻到章节对应的页面。

目录结构中的章节名就是键,而章节的页码就是键值。如果没有这样的映射结构,那么我们必须从书籍的第一页开始,一页一页地查找,这种查找方式无疑是很慢的。

Map容器中的一个键,最多只能映射到一个值,而且同Set容器一样,不能包含重复的键,一旦添加重复的键,那么后面插入的键值会覆盖之前的键值。举个简单的例子,以下是一个包含两个键值对的Map容器:

{"第一节": 1, "第二节": 3}

现在往容器中插入一个重复的键"第二节",键值为5,那么容器中的元素变为:

{"第一节": 1, "第二节": 5

11.3.2 Map接口的常用方法

Java中的Map容器是一个接口,我们学习Map容器主要是学习Map接口的常用操作方法,以及它的实现类型。下表所示为Map接口的常用操作方法:

方法名

描述

int size()

返回容器中的键值对数目。

boolean isEmpty()

  判断容器是否为空,如果为空则返回true,否则返回false

boolean containsKey(Object key)

  判断是否包含指定的键,如果包含就返回true,否则返回false

boolean containsValue(Object value)

 判断是否包含指定的键值,如果包含就返回true,否则返回false

V get(Object key)

 获取key所对应的键值,如果key不存在,则返回null。

V put(K key, V value)

 将由key,value构成的键值对插入到容器中,如果key已存在,则替换先前的键值,并返回先前key所对应的键值,如果key不存在,则返回null

V remove(Object key)

 删除容器中的key,并返回其对应的键值。如果key不存在,则返回null

void clear()

移除容器中的全部元素。

Set<K> keySet()

 返回容器中的所有键,返回值是一个Set类型

Collection<V> values()

 返回容器中的所有键值,返回值是一个Collection类型

11.3.3 Hashtable类型

Hashtable类继承于Dictonary类,实现了Map接口。下表所示为Hashtable类的常用构造方法:

构造方法

描述

Hashtable()

构造一个空的Hashtable容器,容器容量默认为11,扩容因子默认为0.75。

Hashtable(int initialCapacity)

  构造一个初始容量为initialCapacity大小,扩容因子默认为0.75的Map容器,initialCapacity小于等于0时会抛出异常。

Hashtable(int initialCapacity, float loadFactor)

构造一个初始容量为initialCapacity大小,扩容因子为loadFactor的Hashtable容器,initialCapacity小于等于0或loadFactor小于等于0时会抛出异常。

表中的构造方法提到了一个扩容因子,这里的扩容因子是指容器中的元素数大于容量*扩容因子的值时,会动态扩容,容量扩容至原来的两倍。

读者需注意,在构造Hashtable容器时,键与键值不能使用基本数据类型, 因为这些基本类型不支持hashCode方法和equals方法。如需使用整型值,浮点值,布尔值等作为键名或键值,则应该使用它们对应的包装类。在Java中int类型的包装类是Integer,浮点类型的包装类是Float, 布尔类型的包装类型是Boolean, char类型的包装类是Character。

代码实例-使用Hashtable来快速查找

import java.util.Map;
import java.util.Hashtable;
public class HelloJava{
    public  static void main(String[] args) {
        // Interger是Java内置的整型类
        Map<String, Integer> book = new Hashtable<String, Integer>();
        book.put("第一章", 1);
        book.put("第二章", 3);
        book.put("第三章", 5);
        String chapter = "第三章";
        Integer pageNumber = book.get(chapter);
        if (pageNumber != null) {
            System.out.printf("%s在第%d页%n", chapter, pageNumber);
        }
    }

11.3.4 HashMap类型

HashMap是Map接口的一个实现类,可通过以下方法来构造HashMap:

构造方法

描述

HashMap()

构造一个空的HashMap容器,容器容量默认为16,扩容因子默认为0.75。

HashMap(int initialCapacity)

  构造一个初始容量为initialCapacity大小,扩容因子默认为0.75的HashMap容器,initialCapacity小于等于0时会抛出异常。

HashMap(int initialCapacity, float loadFactor)

构造一个初始容量为initialCapacity大小,扩容因子为loadFactor的HashMap容器,initialCapacity小于等于0或loadFactor小于等于0时会抛出异常。

HashMap(Map<K, V> t)

使用已构造的映射结构t来构造HashMap

以上构造方法中的扩容因子同Hashtable,不再赘述。

HashMap与Hashtable有很多相同点:键名与键值不能为基本类型,都是基于哈希表的映射结构,也都实现了Map接口。既然如此,那为什么还要多余的设计HashMap这个类?二者最大的不同点在于对并发处理的设计。Hashtable出现的时间早于HashMap, 作者在实现Hashtable时为保证并发读写操作的线程安全性,在许多方法中都加了锁, 而HashMap的作者在实现时并没有做同步处理。如果是单线程环境,HashMap的性能明显优于Hashtable,如果是多线程环境,则可以考虑使用Hashtable。关于多线程,线程安全以及锁,会在第十三章中详细讲解。

代码实例-使用HashMap来快速查找

import java.util.Map;
import java.util.HashMap;
public class HelloJava{
    public  static void main(String[] args) {
        // Interger是Java内置的整型类
        Map<String, Integer> book = new HashMap<String, Integer>();
        book.put("第一章", 1);
        book.put("第二章", 3);
        book.put("第三章", 5);
        String chapter = "第三章";
        Integer pageNumber = book.get(chapter);
        if (pageNumber != null) {
            System.out.printf("%s在第%d页%n", chapter, pageNumber);
        }
    }
}

11.2.4 最具实力的小班培训

来这里参加Python和Java小班培训的学员大部分都找到了很好的工作,平均月薪有11K,学得好的同学,拿到的会更高。由于是小班教学,所以薯条老师有精力把每位学员都教好。打算参加线下小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,免费领取课程大纲
(3) Java后端开发工程师高薪就业班,月薪11K-20K, 免费领取课程大纲
(4) Python大数据分析,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取学习资料:

关注微信公众号.jpg












欢迎 发表评论:

请登录

忘记密码我要注册

注册账号

已有账号?请登录