java集合框架(三)

195 阅读3分钟
MAp集合详解

Map集合的底层使用的是数组加链表加红黑树的数据结构进行存储,储存的数据都是成对的,都是满足(key,value)形式的键值对。

Map接口的主要实现类是HashMap,除此之外还有HashMap的子类LinkdHashMap,以及HashTable,TreeMap等实现类

HashMap底层的结构详解:HashMap底层使用的是哈希表,采用数组加单向链表加红黑树的数据结构来储存数据,其中维护了一个长度为2的n次方的Entry类型的数组,数组的每一个位置都被称为一个桶(bucket),向集合中所添加的映射关系(key。value)最终都被封装成Map.Entry类型的对象,放到某个桶中。当我们要向集合中添加元素的时候,就要调用其HashCode()方法计算key的hash值,然后再调用HashMap中的hash()方法重新计算其哈希值,最后通过异或运算计算添加的元素在集合中的位置,如果位置为null则直接将元素添加到该位置上,如果计算所得的位置上已经有元素了,就会通过hash值和equals()方法去判断该位置上元素的key与添加元素的key是否相同,如果相同就使用新添加的元素的value值去覆盖原有位置上key所对应的value值。如果不同就会使用一个单向链表让原有位子上的元素去指向新添加的元素,从而将元素添加进集合中。

HashMap底层的扩容机制,在创建一个HashMap集合的时候,HashMap集合就会有一个初始化容量【其数值为2的n次方】,和一个加载因子LOAD_FACTOR【默认为0.75】,在添加元素的时候就会那集合中元素的个数去和相应的阈值【阈值为集合的容量*加载因子】,如果添加该元素后所计算出来的容量超过了这个阈值,那么集合就会自动扩容,扩容为原长度的两倍。注意加载因子并不是恒定不变的,在创建集合的时候我们可以直接指定加载因子的大小,当然也可以不去指定,这时候就会使用系统默认的加载因子的大小,即DEFULT_LOAD_FACTOR=0.75f.

HashMap的树化机制:为了确保集合中元素遍历的高效性,当集合中某一条链表中有8个及以上元素时且集合的长度达到了64,就会进行树化,将超过八个元素的链表转变为红黑树,这样做就可以使得集合在进行遍历操作时有更好的性能,当树化的链表中的元素低于六个时就会发生退化,即红黑树退化为单项链表。

HashMap和HashMap的树化逻辑相同,扩容逻辑也类似。

Map集合存储元素的特点:

在HashMap集合中存储的元素都是不可重复的,无序的。

所有的key彼此之间是不可以重复的,无序的,满足Set集合的特点,即所有的key构成一个Set集合,这也意味着key元素所在的类要去重写equals(),和hashcode()

所有的value彼此之间是可以重复的,无序的,所以所有的value就组成了一个Collection集合。

HashMAp中的一个(key,value)键值对构成了一个entry

HashMap中所有的entry彼此之间是不可以重复的,无序的,所有的entry就构成了一个Set集合

Map实现类之间的对比

HashMap是Map接口的主要实现类,其线程是不安全的,但是执行的效率高,

HashTable是Map的旧版实现类,其线程是安全的,但是执行效率低。

LinkedHashMap是HashMap的子类,其在父类数据结构的基础上添加了一组双向链表,使得其在遍历时的性能更好,同时可以按照元素添加的顺序去进行遍历。