Map集合面试题

自闭症网瘾萝莉.ら 提交于 2020-03-16 18:30:51

 

 

有可能问道你都知道哪些常用的Map集合?
  HashMap、HashTable、LinkedHashMap、ConcurrentHashMap。

 

Collection集合接口和Map接口有什么关系?
  没关系,Collection是List、Set父接口不是Map父接口。

 

HashMap是线程安全的吗?线程安全的Map都有哪些?性能最好的是哪个?
  HashMap不是线程安全的。线程安全的有HashTable、ConcurrentHashMap、SynchronizedMap,性能最好的是ConcurrentHashMap。

 

使用HashMap有什么性能问题吗?
  使用HashMap要注意避免集合的扩容,它会很耗性能,根据元素的数量给它一个初始大小的值。

 

HashMap的数据结构是怎样的?默认大小是多少?内部是怎么扩容的?
  HashMap是数组和链表组成的,默认大小为16,当hashmap中的元素个数超过数组大小*loadFactor(默认值为0.75)时就会把数组的大小扩展为原来的两倍大小,然后重新计算每个元素在数组中的位置。

 

怎么按添加顺序存储元素?怎么按A-Z自然顺序存储元素?怎么自定义排序?
  按添加顺序使用LinkedHashMap,按自然顺序使用TreeMap,自定义排序TreeMap(Comparetor c)。

 

HashMap的链表结构设计是用来解决什么问题的?
  HashMap的链表结构设计是用来解决key的hash冲突问题的。

 

HashMap的键、值可以为NULL吗?HashTable呢?
  HashMap的键值都可以为NULL,HashTable不行。

 

HashMap使用对象作为key,如果hashcode相同会怎么处理?

  key的hash冲突,如果key equals一致将会覆盖值,不一致就会将值存储在key对应的链表中。

 

HashMap中的get操作是什么原理?
  先根据key的hashcode值找到对应的链表,再循环链表,根据key的hash是否相同且key的==或者equals比较操作找到对应的值。

 

HashMap 和 Hashtable 有什么区别?
  存储:HashMap 允许key 和 value 为 null,⽽ Hashtable 不允许。
  线程安全:Hashtable 是线程安全的,⽽ HashMap 是⾮线程安全的。
  推荐使⽤:在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使⽤,推荐 在 单 线 程 环 境 下 使 ⽤ HashMap 替 代 , 如 果 需 要 多 线 程 使 ⽤ 则 ⽤ConcurrentHashMap 替代。
 
 
如何决定使⽤ HashMap 还是 TreeMap?
  对于在 Map 中插⼊、删除、定位⼀个元素这类操作,HashMap 是最好的选择,因为相对⽽⾔ HashMap 的插⼊会更快,但如果你要对⼀个 key 集合进⾏有序的遍历,那TreeMap 是更好的选择。 
 
说⼀下 HashMap 的实现原理?
  HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传⼊ key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将value 保存在 bucket ⾥。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是⽤链表和红⿊树存储相同 hash 值的 value。当 hash 冲突的个数⽐较少时,使⽤链表否则使⽤红⿊树。
  ⾃⼰理解:两个不同名称的key但是计算出的hashCode值相同的数据存储在链表或者红⿊树中。
 
 
哪些集合类是线程安全的?
  Vector、Hashtable、Stack 都是线程安全的,⽽像 HashMap 则是⾮线程安全的,不过在 JDK 1.5 之后随着 Java. util. concurrent 并发包的出现,它们也有了⾃⼰对应的线程安全类,⽐如 HashMap 对应的线程安全类就是 ConcurrentHashMap。 
 

了解Map集合吗?Map集合都有哪些实现

HashMap 、HashTable、    LinkedHashMap 、TreeMap、   ConcurrentHashMap

HashMap底层数据结构是哈希表,所以其特点是元素无序且唯一(自定义对象需要重写hashCode和equals方法保证他的唯一性)

Hashtable它和HashMap类很相似,但是它支持同步,Hashtable在哈希表中存储键/值对,当使用一个哈希表,要指定用作键的对象,以及要链接到该键的值。

然后,该键经过哈希处理,所得到的散列码被用作存储在该表中值的索引。

LinkedHashMap 是 Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

TreeMap底层数据结构是红黑树,可以对元素进行排序

ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现

 

因为Map集合也是一个接口,所以利用抽象类多态实现对象的创建,其中的String泛型指的就是键,Student泛型指的就是值,通常统称为一个键值对。

Map集合的数据结构之和键有关,和值无关。


HashMap和HashTable之间的区别
1.HashMap:底层基于数组+单向链表(红黑树),非线程安全,默认容量为16,允许有空的键和值
数组:Node<K,V> [] table ,每一个元素都是一个Node
单向链表:Node<K,V> next,当发生Hash碰撞,会追加链表,当链表长度大于8,那就转换为红黑树

 

 


2.HashTable:底层基于哈希表实现,线程是安全的,默认容量为11,不允许有空的键和值

 

 



hashCode()和equals()方法使用场景
hashCode():顶级父类Object当中的方法,返回值类型为int类型的值,根据一定的规则(存储地址,字段,长度等等)生成一个数组,数据保存的就是Hash值
equals():顶级类Object中的方法,根据一定的比较规则,判断对象是否一致,底层一般逻辑:
1.判断两个对象的内存地址是否一样
2.非空判断和Class类型判断
3.强转
4.对象中的字段一一匹配


HashMap和TreeMap应该如何选择
HashMap:底层采用数组+链表(红黑树)结构,可以实现快速的存储和检索,但是数据是无序的,适用于在Map当中插入删除或者获取元素

TreeMap: 存储结构是一个平衡二叉树,具体实现方式为红黑树,默认采用自然排序,可以自定义排序规则,但是需要实现Comparator接口
能够便捷的实现内部元素的各种排序,但是性能比HashMap差,适用于按照自然排序和自定义排序规则



Set和Map的关系
Set核心就是保存不重复的元素,存储一组唯一的对象
Set当中每一种实现都对应Map
HashSet对应的HashMap,TreeSet对应的TreeMap

 

 


常见的Map排序规则
按照添加规则使用LinkedHashMap,按照自然排序或者自定义规则排序可以采用TreeMap

如何保证Map线程安全
多线程环境下,可以使用concurrent包下有一个ConcurrentHashMap或者是使用Collections.synchronizedList(new HashMap<K,V>());

ConcurrentHashMap保证线程安全,效率比HashTable高,采分段锁


.HashMap底层源码剖析
介绍HashMap底层用到的数据结构

2.为什么采用红黑树,并且为什么临界值为8

3.put和get底层源码的核心流程

.ConcurrentHashMap底层实现
1. JDK1.7和JDK1.8底层实现的区别

2. ConcurrentHashMap底层put方法实现的核心逻辑

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!