写点什么

HashMap 底层实现原理及面试问题,linux 服务器搭建教程视频

用户头像
极客good
关注
发布于: 刚刚

当两个不同的键对象的 hashcode 相同时会发生什么? 它们会储存在同一个 bucket 位置的链表中。键对象的 equals()方法用来找到键值对。


因为 HashMap 的好处非常多,我曾经在电子商务的应用中使用 HashMap 作为缓存。因为金融领域非常多的运用 Java,也出于性能的考虑,我们会经常用到 HashMap 和 ConcurrentHashMap。


二、HashMap 和 Hashtable 的区别




HashMap 和 Hashtable 都实现了 Map 接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。


  1. HashMap 几乎可以等价于 Hashtable,除了 HashMap 是非 synchronized 的,并可以接受 null(HashMap 可以接受为 null 的键值(key)和值(value),而 Hashtable 则不行)。

  2. HashMap 是非 synchronized,而 Ha


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


shtable 是 synchronized,这意味着 Hashtable 是线程安全的,多个线程可以共享一个 Hashtable;而如果没有正确的同步的话,多个线程是不能共享 HashMap 的。Java 5 提供了 ConcurrentHashMap,它是 HashTable 的替代,比 HashTable 的扩展性更好。


  1. 另一个区别是 HashMap 的迭代器(Iterator)是 fail-fast 迭代器,而 Hashtable 的 enumerator 迭代器不是 fail-fast 的。所以当有其它线程改变了 HashMap 的结构(增加或者移除元素),将会抛出 ConcurrentModificationException,但迭代器本身的 remove()方法移除元素则不会抛出 ConcurrentModificationException 异常。但这并不是一个一定发生的行为,要看 JVM。这条同样也是 Enumeration 和 Iterator 的区别。

  2. 由于 Hashtable 是线程安全的也是 synchronized,所以在单线程环境下它比 HashMap 要慢。如果你不需要同步,只需要单一线程,那么使用 HashMap 性能要好过 Hashtable。

  3. HashMap 不能保证随着时间的推移 Map 中的元素次序是不变的。


三、要注意的一些重要术语




  1. sychronized 意味着在一次仅有一个线程能够更改 Hashtable。就是说任何线程要更新 Hashtable 时要首先获得同步锁,其它线程要等到同步锁被释放之后才能再次获得同步锁更新 Hashtable。

  2. Fail-safe 和 iterator 迭代器相关。如果某个集合对象创建了 Iterator 或者 ListIterator,然后其它的线程试图“结构上”更改集合对象,将会抛出 ConcurrentModificationException 异常。但其它线程可以通过 set()方法更改集合对象是允许的,因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改,再调用 set()方法,将会抛出 IllegalArgumentException 异常。

  3. 结构上的更改指的是删除或者插入一个元素,这样会影响到 map 的结构。


四、我们能否让 HashMap 同步?




HashMap 可以通过下面的语句进行同步:


Map m = Collections.synchronizeMap(hashMap);


Hashtable 和 HashMap 有几个主要的不同:线程安全以及速度。仅在你需要完全的线程安全的时候使用 Hashtable,而如果你使用 Java 5 或以上的话,请使用 ConcurrentHashMap 吧。


HashMap 和 HashSet 的区别是 Java 面试中最常被问到的问题。如果没有涉及到 Collection 框架以及多线程的面试,可以说是不完整。而 Collection 框架的问题不涉及到 HashSet 和 HashMap,也可以说是不完整。HashMap 和 HashSet 都是 collection 框架的一部分,它们让我们能够使用对象的集合。collection 框架有自己的接口和实现,主要分为 Set 接口,List 接口和 Queue 接口。它们有各自的特点,Set 的集合里不允许对象有重复的值,List 允许有重复,它对集合中的对象进行索引,Queue 的工作原理是 FCFS 算法(First Come, First Serve)。


首先让我们来看看什么是 HashMap 和 HashSet,然后再来比较它们之间的分别。


五、HashMap 和 HashSet 的区别




HashMap 和 HashSet 的区别是 Java 面试中最常被问到的问题。如果没有涉及到 Collection 框架以及多线程的面试,可以说是不完整。而 Collection 框架的问题不涉及到 HashSet 和 HashMap,也可以说是不完整。HashMap 和 HashSet 都是 collection 框架的一部分,它们让我们能够使用对象的集合。collection 框架有自己的接口和实现,主要分为 Set 接口,List 接口和 Queue 接口。它们有各自的特点,Set 的集合里不允许对象有重复的值,List 允许有重复,它对集合中的对象进行索引,Queue 的工作原理是 FCFS 算法(First Come, First Serve)。


首先让我们来看看什么是 HashMap 和 HashSet,然后再来比较它们之间的分别。


六、什么是 HashSet




HashSet 实现了 Set 接口,它不允许集合中有重复的值,当我们提到 HashSet 时,第一件事情就是在将对象存储在 HashSet 之前,要先确保对象重写 equals()和 hashCode()方法,这样才能比较对象的值是否相等,以确保 set 中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。


public boolean add(Object o)方法用来在 Set 中添加元素,当元素值重复时则会立即返回 false,如果成功添加的话会返回 true。


七、什么是 HashMap




HashMap 实现了 Map 接口,Map 接口对键值对进行映射。Map 中不允许重复的键。Map 接口有两个基本的实现,HashMap 和 TreeMap。TreeMap 保存了对象的排列次序,而 HashMap 则不能。HashMap 允许键和值为 null。HashMap 是非 synchronized 的,但 collection 框架提供方法能保证 HashMap synchronized,这样多个线程同时访问 HashMap 时,能保证只有一个线程更改 Map。


public Object put(Object Key,Object value)方法用来将元素添加到 map 中。


八、HashSet 和 HashMap 的区别




用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
HashMap底层实现原理及面试问题,linux服务器搭建教程视频