首页 > 其他 > 详细

Map集合面试题

时间:2020-03-16 19:13:30      阅读:53      评论:0      收藏:0      [点我收藏+]

 

 

有可能问道你都知道哪些常用的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方法实现的核心逻辑

Map集合面试题

原文:https://www.cnblogs.com/danxun/p/12505412.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!