之前学习的是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. LINQ Group By操作

    在上篇文章 .NET应用程序与数据库交互的若干问题 这篇文章中,讨论了一个计算热门商圈的问题,现在在这里扩展一下,假设我们需要从两张表中统计出热门商圈,这两张表内容如下: 上表是所有政区,商圈中的餐饮 ...

  2. CSharpGL(28)得到高精度可定制字形贴图的极简方法

    CSharpGL(28)得到高精度可定制字形贴图的极简方法 回顾 以前我用SharpFont实现了解析TTF文件从而获取字形贴图的功能,并最终实现了用OpenGL渲染文字. 使用SharpFont,美 ...

  3. 使用注解匹配Spring Aop切点表达式

    Spring中的类基本都会标注解,所以使用注解匹配切点可以满足绝大部分需求 主要使用@within()/@target @annotaton() @args()等... 匹配@Service类中的所有 ...

  4. C#中的Session

    一: 网站开发中,为了保存用户信息我们就会用到session. Session具有以下特点:(1)Session中的数据保存在服务器端:(2)Session中可以保存任意类型的数据:(2)Sessio ...

  5. Android自定义View初步

    经过上一篇的介绍,大家对于自定义View一定有了一定的认识,接下来我们就以实现一个图片下显示文字的自定义View来练习一下.废话不多说,下面进入我们的正题,首先看一下我们的思路,1.我们需要通过在va ...

  6. MVC默认路由实现分页-PagerExtend.dll

    这两天在群里有人咨询有没有现成的.net mvc分页方法,由此写了一个简单分页工具,这里简单分享下实现思路,代码,希望能对大家有些帮助,鼓励大家多造些轮子还是好的. A.效果(这里用了bootstra ...

  7. ng-directive-选择数据

    本文是用angularjs指令写的一个简易数据选择功能,其实就是两个下拉框,把两边的数据相互交换而已,这样的功能最早应该是用jquery写过,但移动端js框架angularjs如果还嵌套jquery来 ...

  8. react+redux教程(五)异步、单一state树结构、componentWillReceiveProps

    今天,我们要讲解的是异步.单一state树结构.componentWillReceiveProps这三个知识点. 例子 这个例子是官方的例子,主要是从Reddit中请求新闻列表来显示,可以切换reac ...

  9. 分布式服务协调员zookeeper - 应用场景和监控

    zookeeper在分布式系统中作为协调员的角色,可应用于Leader选举.分布式锁.配置管理等服务的实现.以下我们从zookeeper提供的API.应用场景和监控三方面学习和了解zookeeper( ...

  10. HTTPS那些事(一)HTTPS原理

    转载来自:http://www.guokr.com/post/114121/ 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传 ...