之前学习的是Collection层次的List接口。List层次比较简单,除去与多线程安全相关的CoppyOnWriteArrayList<T>类,这一个类在集中涉及多线程相关知识时候再学习,以及已经过时的向量Vector<T>、栈Stack<T>外,只剩下两种比较常用的List接口的实现,也就是基于数组的ArrayList和基于链表的Linkedlist两个类。这两个列表实现中最简单、最常用的还是ArrayList。至于LinkedList,由于其具体实现中实现了Deque队列接口,在功能上具有比列表更多的功能,所以在学习完队列之后再学习Linkedlist应该是比较合理的。

在平时的开发中由于队列用到的比较少,所以关于队列的学习也放置在后面。Collection中的另外一个常用的容器是Set接口的相关实现类。又由于java在设计Set实现类时是基于Map进行实现的,也就是说没有Map就没有Set,故而接下来先学习Map,然后再学习Set,这个学习顺序应该是比较合理的。

下面先放上一张Map接口的相关层次结构图(相关资源来自网络):

Map接口中最常用到的实现类有HashMap(无序,快速访问元素)、LinkedHashMap(按照添加顺序排序,快速访问)、TreeMap(按照键的比较升序排列)

接口Map<K,V>

public interface Map<K,V> 

Map<K,V>接口是Map层次的根接口,与Collection<T>接口不同的是,该接口是真正的根接口,并没有拓展自其他的接口。

Map提供将键映射到值的对象,一个映射不能包括重复的键;每个键最多只能映射到一个值(但是值的类型可以为单值类型比如String,也可以为多值类型比如List)。Map接口提供三种collection视图,允许以键集,值集,或键值对映射关系集的形式对某个映射进行查看。映射顺序定义为迭代器在映射的collection视图上返回其元素的顺序。某些映射实现可明确保证其顺序,如 TreeMap、LinkedHashMap 类;另一些映射实现则不保证顺序,如 HashMap 类。

某些映射实现对可能包含的键和值有所限制。例如,某些实现禁止 null 键和值,另一些则对其键的类型有限制。

抽象类AbstractMap<K,V>

public abstract class AbstractMap<K,V> implements Map<K,V>

此类提供了Map接口的骨干实现,其功能类似于Collection接口中的AbstractCollection,都是以最大限度减少实现相应接口所需的工作。此类没有实现的方法为entrySet(),同时限制了put(K key,V value)方法。

要实现不可修改的映射,只需要扩展AbstracMap类,并提供entrySet方法的实现,该实现返回键-值的映射关系set视图。通常返回的set将依次在AbstractSet(Set接口的骨干实现)上实现。此set不支持add或者remove方法,其迭代器也不支持remove方法。(啥意思???)

要实现可修改的映射,除了实现entrySet方法外,还需要实现AbstractMap类的put方法,此类对该方法进行了限制,如果没有重写调用此类或抛出UnsupportedOperationException,此外entrySet().iterator()返回的迭代器也必须另外实现其remove()方法。

类HashMap

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

HashMap是基于哈希表的Map接口的实现。该类是常用的映射。此实现提供了Map接口定义的所有可选的映射操作,允许使用null键和null值。(除了非同步和允许使用null值外,HashMap类与HashTable<已过期>大致相同)。此类不保证映射的顺序,特别是它不保证该顺序永久不变。

迭代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。

HashMap 的实例有两个参数影响其性能:初始容量(默认16)和加载因子(默认0.75)。

注意,此实现不是同步的。

同List相同所有此类的“collection 视图方法”所返回的迭代器都是快速失败 的:在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器本身的 remove 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException

类LinkedHashMap<K,V>

public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。此类提供所有可选的 Map 操作,并且允许 null 元素。由于增加了维护链接列表的开支,其性能很可能比 HashMap 稍逊一筹,不过这一点例外:LinkedHashMap 的 collection 视图迭代所需时间只与映射的大小成比例。HashMap 迭代时间很可能开支较大,因为它所需要的时间与其容量 成比例。

此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)。注意,如果在映射中重新插入键,则插入顺序不受影响。

注意,此实现不是同步的。

结构修改是指添加或删除一个或多个映射关系,或者在按访问顺序链接的哈希映射中影响迭代顺序的任何操作。在按插入顺序链接的哈希映射中,仅更改与映射中已包含键关联的值不是结构修改。在按访问顺序链接的哈希映射中,仅利用 get 查询映射不是结构修改。

同HashMap一样,Collection(由此类的所有 collection 视图方法所返回)的 iterator 方法返回的迭代器都是快速失败的。

LinkedHashMap由于是继承了HashMap,所以其实现是在HashMap的基础上,通过维护连接列表使其具有了可预知的迭代顺序的特性。此类覆盖了HashMap类中的get()、clear()、 containsValue()方法。

注意:通过调用get()返回 null 值并不一定表明此映射不包含该键的映射关系;也可能此映射将该键显式地映射为 null。可使用 containsKey() 操作来区分这两种情况。

JAVA编程思想(第四版)学习笔记----11.10 Map的更多相关文章

  1. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十三)之Strings

    Immutable Strings Objects of the String class are immutable. If you examine the JDK documentation fo ...

  2. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(四)之Operators

    At the lowest level, data in Java is manipulated using operators Using Java Operators An operator ta ...

  3. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(三)之Everything Is an Object

    ---恢复内容开始--- Both C++ and Java are hybird languages. A hybird language allow multiple programming st ...

  4. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(二)之Introduction to Objects

    The genesis of the computer revolution was a machine. The genesis of out programming languages thus ...

  5. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十四)之Type Information

    Runtime type information (RTTI) allow you to discover and use type information while a program is ru ...

  6. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十二)之Error Handling with Exceptions

    The ideal time to catch an error is at compile time, before you even try to run the program. However ...

  7. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十一)之Holding Your Objects

    To solve the general programming problem, you need to create any number of objects, anytime, anywher ...

  8. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十)之Inner Classes

    The inner class is a valuable feature because it allows you to group classes that logically belong t ...

  9. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(九)之Interfaces

    Interfaces and abstract classes provide more structured way to separate interface from implementatio ...

  10. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(八)之Polymorphism

    Polymorphism is the third essential feature of an object-oriented programming language,after data ab ...

随机推荐

  1. [Intel Edison开发板] 05、Edison开发基于MRAA实现IO控制,特别是UART通信

    一.前言 下面是本系列文章的前几篇: [Intel Edison开发板] 01.Edison开发板性能简述 [Intel Edison开发板] 02.Edison开发板入门 [Intel Edison ...

  2. [Javascript] 爬虫 模拟新浪微博登陆

     概述: 由于业务需要,要编写爬虫代码去爬去新浪微博用户的信息. 虽然在网上能找到不少信息,但由于新浪微博改版,其登陆机制进行了修改,故很多老的文章就不适合用了. 经过一番摸索,成功模拟新浪微博的登陆 ...

  3. Linux 与 Linux Windows 文件共享 小知识

    Linux 与 Linux Windows 文件共享   前提说明:windows主机信息:192.168.1.100 帐号:abc 密码:123 共享文件夹:sharelinux主机信息:192.1 ...

  4. 我们为什么使用Node

    引言:Node 已经迅速成为一个可行并且真正高效的web 开发平台.在Node 诞生之前,在服务端运行JavasScript 是件不可思议的事情,并且对其他的脚本语言来说,要实现非阻塞I/O 通常需要 ...

  5. 锋利的jQuery--表单等(读书笔记三)

    1.input元素中的多选的,单选,不选,涉及属性checked   2.select元素中的选中,涉及selected   3.表单的验证   4.表格隔行变色 $("tr:odd&quo ...

  6. [C#] Linq To Objects - 如何操作文件目录

    Linq To Objects - 如何操作文件目录 开篇语: 上次发布的 <LINQ:进阶 - LINQ 标准查询操作概述> 社会反响不错,但自己却始终觉得缺点什么!“纸上得来终觉浅,绝 ...

  7. C#设计模式:单件(例)模式 -- 类也玩计划生育

    这里写的代码,相当于<Head First 设计模式>的读书笔记,原书是java的,自己在学习的过程中将其翻译为C#: (一)剖析经典的单件模式实现 单件模式 -- 确保一个类只有一个实例 ...

  8. c 二叉树的使用

    简单的通过一个寻找嫌疑人的小程序 来演示二叉树的使用 #include <stdio.h> #include <stdlib.h> #include <string.h& ...

  9. 使用MATLAB对图像处理的几种方法(下)

     试验报告 一.试验原理: 图像点处理是图像处理系列的基础,主要用于让我们熟悉Matlab图像处理的编程环境.灰度线性变换和灰度拉伸是对像素灰度值的变换操作,直方图是对像素灰度值的统计,直方图均衡是对 ...

  10. 读书笔记--SQL必知必会07--创建计算字段

    7.1 计算字段 字段(field),基本与列(column)含义相同. 利用计算字段可以直接从数据库中检索出转换.计算或格式化过的数据. 计算字段不实际存在于数据库表中,是运行时在SELECT语句内 ...