热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java集合之Map总结

Map总结Map是所有Map实现类的抽象接口AbstractMap实现了Map接口中的绝大多数方法,减少了Map实现类的重复编码SortedMap是有序的键值对映射

Map总结


  • Map是所有Map实现类的抽象接口
  • AbstractMap实现了Map接口中的绝大多数方法,减少了Map实现类的重复编码
  • SortedMap是有序的键值对映射接口
  • NavigableMap接口实现了SortedMap接口,并支持导航函数的接口
  • HashMap是基于拉链法实现的散列表,一般用于单线程的程序中;HashTable是基于拉链法实现的散列表,一般用于多线程程序中;WeakHashMap也是基于拉链法实现的散列表,它一般也用在单线程程序中,但相比于HashMap,WeakHashMap的键是弱键,当被GC回收时,WeakHashMap的键值对也会被删除;TreeMap是有序的散列表,通过红黑树来实现,一般用于单线程存储有序映射

HashMap与HashTable的异同


HashMap与HashTable的相同点

首先HashMap和HashTable都是存储“键值对”的散列表,而且都是采用拉链法来实现的,存储思想是通过Table数组来存储,Table中的每一个元素都是一个Entry,而每一个Entry都是一个单链表,Entry链表中的每一个结点都存储了键值对映射。

添加键值对(put):根据key值来计算哈希值,通过哈希值找到Table数组索引,然后根据数组索引找到Entry,然后开始遍历单向链表,若key值已经存在于该单向链表中,则用新的value值来替换旧的value值,若key没用出现过在链表中,则创建一个新的链表结点,将该键值对添加在表头中。

删除键值对(remove):首先根据key值计算哈希值,找到数组索引,根据索引找到Entry,然后遍历该单链表,若该key-value存在于该链表中,则删除链表中的结点

HashMap与HashTable的不同点

继承和实现方式不同

HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
Hashtable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。

线程的安全不同

Hashtable的几乎所有函数都是同步的,即它是线程安全的,支持多线程。
而HashMap的函数则是非同步的,它不是线程安全的。若要在多线程中使用HashMap,需要我们额外的进行同步处理。 对HashMap的同步处理可以使用Collections类提供的synchronizedMap静态方法,或者直接使用JDK 5.0之后提供的java.util.concurrent包里的ConcurrentHashMap类。

对null值的处理不同

HashMap允许存储key和value都为null的元素

HashTable不允许存储key或value为null的元素

支持的遍历种类不同

HashMap只支持Iterator(迭代器)遍历。
而Hashtable支持Iterator(迭代器)和Enumeration(枚举器)两种方式遍历。

Enumeration 是JDK 1.0添加的接口,只有hasMoreElements(), nextElement() 两个API接口,不能通过Enumeration()对元素进行修改 。
而Iterator 是JDK 1.2才添加的接口,支持hasNext(), next(), remove() 三个API接口。HashMap也是JDK 1.2版本才添加的,所以用Iterator取代Enumeration,HashMap只支持Iterator遍历。

通过迭代器遍历时,遍历的顺序不同

HashMap是“从前向后”的遍历数组;再对数组具体某一项对应的链表,从表头开始进行遍历。
Hashtable是“从后往前”的遍历数组;再对数组具体某一项对应的链表,从表头开始进行遍历。

量初始值和增加方式不同

HashMap默认的容量大小是16;增加容量时,每次将容量变为“原始容量x2”
Hashtable默认的容量大小是11;增加容量时,每次将容量变为“原始容量x2 + 1”。

添加键值对时计算哈希值的方法不同

HashMap添加元素时,是使用自定义的哈希算法。
Hashtable没有自定义哈希算法,而直接采用的key的hashCode()。

部分API不同

Hashtable支持contains(Object value)方法,而且重写了toString()方法;
而HashMap不支持contains(Object value)方法,没有重写toString()方法。

HashMap和WeakHashMap的异同


HashMap和WeakHashMap的相同点

1 它们都是散列表,存储的是“键值对”映射。
2 它们都继承于AbstractMap,并且实现Map接口
3 它们的构造函数都一样。
   它们都包括4个构造函数,而且函数的参数都一样。
4 默认的容量大小是16,默认的加载因子是0.75。
5 它们的“键”和“值”都允许为null。
6 它们都是“非同步的”。

HashMap和WeakHashMap的不同点

HashMap实现了Cloneable和Serializable接口,而WeakHashMap没有

HashMap的键是强引用,而WeakHashMap的键是弱引用

WeakHashMap动态回收的步骤:

  1. 首先新建一个WeakHashMap的集合,将键值对添加进去
  2. 当某个弱键不再被对象引用时,它将会被GC回收,当GC回收这个弱键的同时会被添加到一个queue队列中
  3. 当下一次使用WeakHashMap时会先同步table和queue,table中保存了全部的键值对,而queue中保存了被GC回收的弱键,同步之后,就可以删除被GC回收的弱键所对应的键值对。

 


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
author-avatar
手机用户2502859387
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有