一句话快速总结: 通过arrayMap.entrySet().iterator()
方法拿到迭代器来遍历.
正文: 一开始,我用了for循环遍历去删除,这样当然会出现漏删的元素。
于是我通过keySet来遍历,但在执行arrayMap.remove(key)
后,keySet的迭代器同样受到了影响(因为keySet是ArrayMap内部结构的直接引用),所以依然会漏删元素
Iterator<String> it = arrayMap.keySet.iterator();
while (it.hasNext()) {
key = it.next();
if (deleteChatMsg(arrayMap.get(key))) {
arrayMap.remove(key);
}
}
然后去找了下HashMap遍历删除元素的资料,尝试后惊喜地发现ArrayMap同样可以通过iterator.remove()去实现删除集合中的对应元素。
for (Iterator<Map.Entry<String, ChatMsg>> it = arrayMap.entrySet().iterator(); it.hasNext();){
Map.Entry<String, ChatMsg> item = it.next();
if (deleteChatMsg(item.getValue())) {
it.remove();
}
}
ArrayMap和SimpleArrayMap的差别
因为隐约记得ArrayMap内部好像是数组的实现,特意去翻源码看了下,原来ArrayMap实现了map接口,因此可以当做map来迭代,而SimpleArrayMap是其父类,并没有实现map接口,可以看做是ArrayMap的简单实现,性质上更类似ArrayList, 并没有提供迭代器相关的方法
public class SimpleArrayMap<K, V>
public class ArrayMap<K, V> extends SimpleArrayMap<K, V> implements Map<K, V>