一、Map集合介绍
两大集合,Collection和Map,之前的Collection中包含List,Set和Queue,可以快速查找元素,Map则是以键值对为基础的另一种集合,在英文版的Java核心技术中,Map被称为映射。
1.Map和Collection的区别(面试常客)
Map是将键映射到值的对象,一个映射不能包含重复的键,每个键只能映射到一个值。
区别:
1.Map集合存储元素是成对出现的,键唯一,但是值可以重复;
2.Collection集合存储元素是单独出现的,Collection的子类Set是唯一的,List是可重复的。
在数据结构中,Map结合针对键有效,和值无关,Collection中对值有效。
2.Map都有什么基本功能
二、散列表介绍
无论是Set和Map,都有与之对应的HashSet和HashMap,之前学习的链表和数组两种数据结构,都是可以顺序地排列数据的,而且存储的顺序和取出的顺序都是一致的。但是比如说我想获取一个元素,就要遍历整个集合,这样就会很耗时,消耗大量的资源。
这时,散列表闪亮登场,如果使用场景不在意元素的顺序,就是为了快速查找元素的数据,可以使用散列表。
散列表原理
散列表,也就是哈希表,为每个对象计算出一个整数,成为散列码,根据这些计算出来的散列码保存在对应的位置上。在Java中,散列表用的是链表数组实现的,每个列表称之为桶。
如果hashCode散列码相同,就会存储在同一个位置上,这种情况叫散列冲突。
怎么解决?需要用该对象与桶上的对象进行比较,如果存在,就不添加,如果不存在就添加。
JDK1.8中 ,桶满了就会从链表变成平衡二叉树。
如果散列表太满,需要对散列表再散列,创建一个桶数更多的散列表,兵将原来所有的元素插入到新表中,丢弃原来的表。
装填因子(load factor)决定了何时对散列表再散列
装填因子默认0.75,如果表中超过了75%的位置已经填入了元素,那么这个表就会用双倍的桶数自动进行再散列。
三、红黑树介绍
桶满了之后,链表转成红黑树,那么TreeSet和TreeMap底层都是红黑树来实现的。
几种树的用途:
红黑树:平衡二叉树,广泛应用于C++的STL中,map和set都是红黑树实现的
B/B+树:用于磁盘文件组织,数据索引和数据库索引
Trie树(字典树):用在统计和排序大量字符串,如自动机。
在二叉树中,有可能会出现线性的情况,如果推出一种两边都均衡的树就好了,那么就出现了红黑树,也就是平衡二叉树,两边是一样的。