之前学习的是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. EasyPR--开发详解(7)字符分割

    大家好,好久不见了. 一转眼距离上一篇博客已经是4个月前的事了.要问博主这段时间去干了什么,我只能说:我去“外面看了看”. 图1 我想去看看 在外面跟几家创业公司谈了谈,交流了一些大数据与机器视觉相关 ...

  2. ABP源码分析三十五:ABP中动态WebAPI原理解析

    动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类就可以对外提供WebAPI的功能, ...

  3. ThinkPhp5.0模型验证规则

    Tp5提供了模型数据规则的验证功能,用于在数据save或者update前验证数据的有效性.Tp5提供校验规则的类为\Think\Validate,默认提供的校验规则可以查看该文件. 在Model文件中 ...

  4. Sql Server系列:规范化及基本设计

    1 理解表 表是具有相同常规属性(attribute)的数据实例的集合.这些数据实例组成数据行和列. 2 数据表设计范式 2.1 第一范式 第一范式(1NF)是关于消除重复数据组和保证原子性的规范化. ...

  5. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之目录结构

    一个技术汪的开源梦 —— 目录 这篇文章是开源公共组件的开篇那就先说说项目的 Github 目录结构和 .Net Core 的项目结构. 1. GitHub 目录结构和相关文件 - src 源码项目目 ...

  6. 多线程同步工具——volatile变量

    关于volatile,找了一堆资料看,看完后想找一个方法去做测试,测了很久,感觉跟没有一样. 这本书<深入理解Java内存模型>,对volatile描述中有这样一个比喻的说法,如下代码所示 ...

  7. gradlew wrapper使用下载到本地的gradle.zip文件装配--转

    原文地址:http://www.myexception.cn/mobile/1860089.html gradlew wrapper使用下载到本地的gradle.zip文件安装.使用gradlew来b ...

  8. 原创:去繁存简,回归本源:微信小程序公开课信息分析《一》

    以前我开过一些帖子,我们内部也做过一些讨论,我们从张小龙的碎屏图中 ,发现了重要讯息: 1:微信支付将成为重要场景: 2:这些应用与春节关系不小,很多应用在春节时,有重要的场景开启可能性: 3:春节是 ...

  9. 福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!

    距离“上次框架完整发布”已经过去了一年半了,应群中的朋友要求,决定在国庆放假之际,把最新的框架发布出来,并把帮助文档整理出来,这样可以方便大家快速上手.   发布内容 注意,本次发布,只包含 Rafy ...

  10. [C1] C1FlexGrid 排除非绑定列的验证效果

    一.前言 前提是 C1FlexGrid 中存在数据绑定列和自定义列(非数据绑定列),此时如果该行编辑后出现排他错误,自定义列也会出现验证结果的红色边框: 但是自定义列如果只是一些按钮操作,提示说明什么 ...