概述
- 采用了延迟删除的机制,通过将删除 key 的 value 设置 DELETED,方便之后对该下标的存储进行复用;
- 使用二分查找,时间复杂度为 O(logn),如果没有查找到,那么取反返回左边界,再取反后,左边界即为应该插入的数组下标;
- 如果无法直接插入,则根据 mGarbage 标识(是否有潜在延迟删除的无效数据),进行数据清除,再通过 System.arraycopy 进行数组前移,将目标元素插入二分查找左边界对应的下标;
- mSize 小于等于 keys.length,小于的部分为空数据或者是 gc 后前移的数据的原数据(也是无效数据),因此二分查找的右边界以 mSize 为准;mSize 包含了延迟删除后的元素个数;
- 如果遇到频繁删除,不会触发 gc 机制,导致 mSize 远大于有效数组长度,造成性能损耗;
- 根据源码,可能触发 gc 操作的方法有(1、put;2、与index有关的所有操作,setValueAt() 等;3、size()方法;)
- mGarbage 为 true 不一定有无效元素,因为可能被删除的元素恰好被新添加的元素覆盖。
使用场景
key为整型;
不需要频繁的删除;
元素个数相对较少;