JAVA编程思想(第四版)学习笔记----11.10 Map
之前学习的是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的更多相关文章
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十三)之Strings
Immutable Strings Objects of the String class are immutable. If you examine the JDK documentation fo ...
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(四)之Operators
At the lowest level, data in Java is manipulated using operators Using Java Operators An operator ta ...
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(三)之Everything Is an Object
---恢复内容开始--- Both C++ and Java are hybird languages. A hybird language allow multiple programming st ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(九)之Interfaces
Interfaces and abstract classes provide more structured way to separate interface from implementatio ...
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(八)之Polymorphism
Polymorphism is the third essential feature of an object-oriented programming language,after data ab ...
随机推荐
- ABP源码分析八:Logger集成
ABP使用Castle日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等.对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方 ...
- Java 8函数编程轻松入门(五)并行化(parallel)
1.并发与并行的区别 并发: 一个时间段内有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但在任一个时刻点只有一个程序在处理机上运行 并行: 在同一个时刻,多核处理多个任务 ...
- [转]keil使用详解
第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性.可维护性上有明显的优势,因而易学易用.用过 ...
- javascript中的Function和Object
写的很好,理解了很多,特此转发记录 转自:http://blog.csdn.net/tom_221x/archive/2010/02/22/5316675.aspx 在JavaScript中所有的对象 ...
- 【.NET深呼吸】动态类型(扩充篇)
前面两文中,老周已向大家介绍了关于动态类型对象的两种级别的使用方案,本篇呢,老周再讲一个自定义动态类型的例子. 前面给大家演示的例子中,动态类型中包装的是字典类型来存储数据的,这一次咱们换一种风味,老 ...
- <JavaScript语言精粹>--<读书笔记三>之replace()与正则
今天有人问我repalce(),他那个题目很有意思.我也不会做,于是我就去查,结果发现就是最基础的知识的延伸. 所以啊最基础的知识才是很重要的,千万不能忽略,抓起JS就写代码完全不知到所以然,只知道写 ...
- 设计模式(十一):从文Finder中认识"组合模式"(Composite Pattern)
上一篇博客中我们从从电影院中认识了"迭代器模式"(Iterator Pattern),今天我们就从文件系统中来认识一下“组合模式”(Composite Pattern).说到组合模 ...
- 学习SpringMVC——国际化+上传+下载
每个星期一道菜,这个星期也不例外~~~ 一个软件,一个产品,都是一点点开发并完善起来的,功能越来越多,性能越来越强,用户体验越来越好……这每个指标的提高都需要切切实实的做点东西出来,好比,你的这个产品 ...
- 使用TypeScript拓展你自己的VS Code!
0x00 前言 在前几天的美国纽约,微软举行了Connect(); //2015大会.通过这次大会,我们可以很高兴的看到微软的确变得更加开放也更加务实了.当然,会上放出了不少新产品和新功能,其中就包括 ...
- c#编程基础之字符串基础
1.C#中单个的字符串用单引号包含就是char类型,('a'),单引号中放且只能放一个字符 2.单个字符也可以表示为字符串,还可以有长度为0的字符串. 3.使用s.Length属性来获得字符串中的字符 ...