安卓最基本的数据结构 数组和(模拟指针)引用
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就会插入
第三步,判断扩容,当数组容量超过自大容量事就会扩容一倍。
请参考下图
图片来源:https://www.jianshu.com/p/95d323bc546c
网友评论