Map 接口的俩个实现类Hashmap Hashtable Treemap底层结构&源码

Map 接口
Java集合包括俩大类
一类是保存单列数据的Collection接口,Collection又包括List 和Set子接口
一类是保存双列数据的Map接口,常见的实现类为Hashmap , Hashtable TreeMap,Properties

Map 接口的特点
保存键值对的数据
键不能重复
keyvalue值可以为null
list&map 均重写了toString 可以直接打印

Hashmap
Hashmap 有俩个影响因素
一个是初始capacity: 创建hashmap时候桶的个数
一个是load factor:0.75 平衡了存储和查询

Hashmap 底层结构
创建hashMap, HashMap hashMap = new HashMap();
初始化了如下变量
table: 保存了数据的数组,如下:
在这里插入图片描述
table 结构如下图,每一个格子称为桶,当一个桶上有多个元素时候,一般以链表保存,当元素个数>8 的時候,以树结构保存

在这里插入图片描述
threshold: 临界值,超过该值就要扩容,初始化hashmap之后就变为0.75

在这里插入图片描述
第一次put值的时候,变量赋值,table 容量变为16,临界值threshold = 160.75 =12
在这里插入图片描述
当到达threshold=12 时候,table 容量变为16
2 = 32
threshold =32*0.75=24
在这里插入图片描述

Hashmap 源码
初始化 HashMap hashMap = new HashMap();
底层就是把loadFactor 从0 变为0.75

 public HashMap() {
        this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
    }
    static final float DEFAULT_LOAD_FACTOR = 0.75f;

往hashmap 中put 元素

public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }
  //这里的hash 方法获取到key的hashcode方法
 static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

扩容方法,采用的是左移位运算相当与*2 的计算
HashMap的resize方法
在这里插入图片描述
当扩容的时候,有可能打乱hashmap元素顺序,重新放置元素

hashmap 总结
在这里插入图片描述
Hashtable 底层结构
hashtable使用和hashmap 几乎一样
底层结构也是哈希表,同hashmap
所以只要直到二者区别就好了
在这里插入图片描述
Treemap底层结构(非重点)
treemap 底层是红黑树
treemap 元素默认按照key的自然排序,或者定制排序的
treeset底层是treemap, key是treeset元素,value为空
自然排序指implement comparable 重写compare to 方法
定制排序指创建treemap 的时候,指定排序规格 用new Comparator(){}内部类实现

面试题

通过map.size() 和 map.isEmpty() 判断map 元素个数是否为空,那个效率高?
效率一样高, map.isEmpty() 底层也是判断size() ==0

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页