热门标签 | 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开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • GSIOpenSSH PAM_USER 安全绕过漏洞
    漏洞名称:GSI-OpenSSHPAM_USER安全绕过漏洞CNNVD编号:CNNVD-201304-097发布时间:2013-04-09 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
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社区 版权所有