2018-07-04 HashMap与HashTable

安卓最基本的数据结构 数组和(模拟指针)引用

java有四种引用分别为(强引用 软引用 弱引用 虚引用) 四种引用主要有两个目的,

一是让程序员能通过代码的方式决定对象的生命周期,

二是方便java 虚拟机垃圾回收 (此篇不做详细介绍,主要介绍Hashmap与Hashtable)

先说两者不同点,

1,HashMap可以有空键值对  HashTable,不可以  

2,HashMap线程不安全,HashTable用synchronized修饰,线程安全

3:HashMap迭代器是fail-fast  而hashtable的迭代器是enumerator,有其他线程修改hashMap结构的时候(新增删除)会报concurrent modification exception 同步修改异常

4:因为hashtabl要做同步处理,单线程的时候,比hashmap性能要慢

5:hashmap随着时间的推移,不能保证 map中的次序是不变的。

思考,我们能否让hashmap同步?

答案是可以的:hashmap可以通过collections.synshronnizeMap(hashmap)同步。Map map=collection.synshronnize(hashMap);

java5提供了concurrentHashMap替代hashtable,比hashtable的性能和可扩展性都要好。

除了以上五点不同意外,两者完全相同。

初始长度为 16 ,必须是2的幂,    空间站0.75是扩容,链表长度 到8 转红黑树,为6时,转链表

核心方法Put 流程介绍

第一步,判断hashmap是否为空或者好吃那个地是否为零,若为空,或者长度为零,扩容。

第二步,put方法根据key计算出位置,判断数组下标值是否为空,如果为空,插入value,如果不为空,判断key是否存在,若存在替换value值

如果不存在,判断是否为treeNode,如果是,通过红黑树插入键值对,否就准备遍历插入,在判断链表长度是否大于8,如果大于,通过红黑树插入键值对,小于则会判断链表中的key!=null,若kay!=null则覆盖,key==null我们的value就会插入

第三步,判断扩容,当数组容量超过自大容量事就会扩容一倍。

请参考下图

2018-07-04 HashMap与HashTable_第1张图片

图片来源:https://www.jianshu.com/p/95d323bc546c 

你可能感兴趣的:(2018-07-04 HashMap与HashTable)