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 ...
随机推荐
- ASP.NET Web API 开篇示例介绍
ASP.NET Web API 开篇示例介绍 ASP.NET Web API 对于我这个初学者来说ASP.NET Web API这个框架很陌生又熟悉着. 陌生的是ASP.NET Web API是一个全 ...
- CSharpGL(12)用T4模板生成CSSL及其renderer代码
CSharpGL(12)用T4模板生成CSSL及其renderer代码 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立 ...
- C++ std::priority_queue
std::priority_queue template <class T, class Container = vector<T>, class Compare = less< ...
- MongoDB学习笔记~数据模型属性为集合时应该为它初始化
回到目录 今天要说一下技术点,我们在设计mongodb的数据模型时,如果属性是数组或者集合类型,我们在模型初始化时,需要为它们初始化一下,否则在数据库里将会被存储为NULL,当被存储为NULL时,我们 ...
- Enterprise Solution 进销存管理软件 C/S架构,支持64位系统 物流,资金流,信息流全面集成
定位 Target Customers 中小型生产制造企业,批发零售类,贸易企业 主要模块 Modules 采购.销售.库存.财务账款四大模块,包含企业运作过程中销售.采购.库存各岗位需 ...
- 【Win 10 应用开发】Sqlite 数据库的简单用法
如果老周没记错的话,园子里曾经有朋友写过如何在 UWP 项目中使用 Sqlite数据库的文章.目前我们都是使用第三方封装的库,将来,SDK会加入对 Sqlite 的支持. 尽管目前 UWP-RT 库中 ...
- 存储程序(2)——MYSQL
1.触发器 触发器是与特定数据表相关联的存储过程,当相应的数据表被INSERT.DELETE或UPDATE语句修改时,触发器将自动执行.触发器可以被设置成在这几种语句处理每个数据行之前或之后触发.触发 ...
- CSS画图
The Shapes of CSS All of the below use only a single HTML element. Any kind of CSS goes, as long as ...
- Android消息传递之EventBus 3.0使用详解
前言: 前面两篇不仅学习了子线程与UI主线程之间的通信方式,也学习了如何实现组件之间通信,基于前面的知识我们今天来分析一下EventBus是如何管理事件总线的,EventBus到底是不是最佳方案?学习 ...
- JavaScript学习总结(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...