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

面试Java基础之HashMap、Hashtable、WeakHashMap比较

在Java面试中,有关集合框架常见问题就经常出现HashMap和HashTable的比较。主要是为了用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。Map

在Java面试中,有关集合框架常见问题就经常出现HashMap和HashTable的比较。主要是为了用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。

Map
├Hashtable
├HashMap
└WeakHashMap

  • Hashtable是Dictionary的子类
 public class Hashtable<K, V> extends Dictionary<K, V> implements Map<K, V>, Cloneable, Serializable {}
  • HashMap是AbstractMap一个实现类
public class HashMap<K, V> extends AbstractMap<K, V> implements Cloneable, Serializable {}
public abstract class AbstractMap<K, V> implements Map<K, V> {}

通过继承关系,我们可以看到HashMap和Hashtable都实现了Map接口。那Map接口到底是何方神圣?俩个类都实现他呢?

Map是没有持续Collection接口,是用于保存具有映射关系的数据(key-vlaue)。Map供给key到value的映射,Map的key不允许重复,每个key只能映射一个value。即同一个Map对象的任何两个key通过equals方法比较总是返回false,Map中包含了一个keySet()方法,用于返回Map所以key组成的Set集合。笼统地说Map接口其实可以说包含了三个集合,一组key-value集合、一组key集合以及value集合。 Map是键到值的映射,Java集合框架在实现上采用一个个Map.Entry内部类来封装每一个键值对,这样,Map中的元素就变成了Map.Entry的集合。

  • HashMap类
    HashMap允许键(key)和值(value)为空(null),null可以作为键,这样的键只有一个,但可以有一个或多个键所对应的值为null,这里有个需要注意的是,但我们用get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。HashMap是非synchronized(非线程安全的实现),如果涉及到多个线程,那就不应该考虑使用HashMap。但是Java 5提供了ConcurrentHashMap,它比HashTable的扩展性更好、性能更高。HashMap可以通过下面的语句进行同步:Map map = Collections.synchronizeMap(hashMap);

  • Hashtable类
    HashTable不允许有null的键(key)和值(value),HashTable是synchronized(线程安全实现),这意味着HashTable是线程安全的,多个线程可以共享一个HashTable。上面提到ConcurrentHashMap到底和Hashtable有啥不一样,笔者也查阅下相关知识,主要Hashtable的实现方式是锁整个hash表,而ConcurrentHashMap分段式封锁,分层多个节点进行关键部位加锁,避免大锁,允许多个修改操作并发进行。具体可以了解Java集合—ConcurrentHashMap原理分析

  • WeakHashMap类
    WeakHashMap是一种改进的HashMap,它对key实验“弱引用”,若是一个key不再被外部所引用,那么该key可以被GC收受接管。

  • hashCode和equals方法
    如果涉及使用对象作为key,那么key的对象都必须实现hashCode和equals方法。hashCode和equals方法持续自根类Object,若是你用自定义的类算作key的话,就需要同时复写equals办法和hashCode方法,因为我们java的集合中判断两个对象是否相等,是根据hashCode和equals这个俩个方法。规则是先判断两个对象的hashCode是否相等,如果不相等,认为两个对象也不相等,如果相等,再判断两个对象用equals运算是否相等。如果不相等,认为两个对象也不相等,如果相等,认为两个对象相等。

    • hashCode方法,返回该对象的哈希码值。用哈希函数来计算散列值以实现哈希表这种数据结构。hashCode用来提高Map里面的搜索效率的,Map会根据不同的hashCode来放在不同的位置,Map在搜索一个对象的时候先通过hashCode找到相应的位置,然后再根据equals方法判断这个位置上的对象与当前要插入的对象是不是同一个。其实hashCode用来定位要存放的位置。我们可以通过重载hashCode方法来达到自己需要的需求。
    • equal方法默认是两个对象的引用的比较,意思就是指向同一内存(即进行内存地址的比较),地址则相等,否则不相等。如果你现在需要利用对象里面的值来判断是否相等,则重载equal方法。

笔者水平有限,若有错漏,欢迎指正,谢谢!


参考文章:
http://www.cnblogs.com/SharkBin/archive/2012/10/13/2722535.html
http://blog.csdn.net/jiary5201314/article/details/51439982


推荐阅读
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • Java Set集合源码深度解析
    本文将深入探讨Java集合框架中的Set接口及其主要实现类HashSet、LinkedHashSet和TreeSet的源码实现,帮助读者理解这些集合类的工作原理及应用场景。 ... [详细]
  • 每位开发者都应该拥有一个展示自我技能与分享知识的空间——个人技术博客。本文将指导你如何使用静态网站生成器Hexo结合GitHub Pages搭建这样一个平台。 ... [详细]
  • HashTable与ConcurrentHashMap均可实现HashMap的功能,对外提供了键值对存储的数据结构。但是在内部结构及实现上有何区别,性能上的差异到底在哪里又是如何导致的 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • TechStride 网站
    TechStride 成立于2014年初,致力于互联网前沿技术、产品创意及创业内容的聚合、搜索、学习与展示。我们旨在为互联网从业者提供更高效的新技术搜索、学习、分享和产品推广平台。 ... [详细]
  • 分享一个简化版的Silverlight链接图项目:Link Map Simplified
    本文介绍了一个使用Silverlight开发的可视化工具,主要用于展示和操作复杂的实体关系图(Graph)。该工具在犯罪调查系统中得到了广泛应用,帮助用户直观地获取和理解相关信息。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • Java集合框架源码解读(1)——ArrayList、LinkedList和Vector
    java.util.List接口是JavaCollectionsFramework的一个重要组成部分,List接口的架构图如下:本文将通过剖析List接 ... [详细]
  • 深入解析:主流开源分布式文件系统综述
    本文详细探讨了几款主流的开源分布式文件系统,包括HDFS、MooseFS、Lustre、GlusterFS和CephFS,重点分析了它们的元数据管理和数据一致性机制,旨在为读者提供深入的技术见解。 ... [详细]
  • 重构:优化现有代码设计(第二版)笔记
    本文介绍了重构的基本概念,通过具体示例展示了如何提炼函数以处理过长的代码段,并探讨了多种重构技术,如分阶段重构、封装变量等。 ... [详细]
  • 本文详细介绍了C++标准模板库(STL)中各容器的功能特性,并深入探讨了不同容器操作函数的异常安全性。 ... [详细]
  • 将学生对象和学生的归属地通过键与值存储到map集合中。importjava.util.HashMap;importjava.util.Iterator;importjava.uti ... [详细]
author-avatar
风去无痕吧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有