集合面试题之双列集合Map
Posted wishsaber
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合面试题之双列集合Map相关的知识,希望对你有一定的参考价值。
一.了解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底层源码剖析
1.介绍HashMap底层用到的数据结构
2.为什么采用红黑树,并且为什么临界值为8
3.put和get底层源码的核心流程
九.ConcurrentHashMap底层实现
1. JDK1.7和JDK1.8底层实现的区别
2. ConcurrentHashMap底层put方法实现的核心逻辑
以上是关于集合面试题之双列集合Map的主要内容,如果未能解决你的问题,请参考以下文章