循环判断删除list元素

错误演示增强for循环

1
2
3
4
5
6
7
8
List<String> lists = new ArrayList<String>();
String deleteString = "del";
lists.add("del");
lists.add("fhd");
lists.add("test");
for (String s : lists)
if (s.equals(deleteString))
lists.remove(s);

删除元素后继续循环会报错误信息ConcurrentModificationException,如下图所示:

增强forError

直接原因:modCount != expectedModCount + modCount表示List的add或者remove方法次数 + expectedModCount是指 Iterator现在期望这个 List被修改的次数

分析 :java的增强for循环根据list对象创建一个Iterator迭代对象,创建的时候modCount被赋值给了expectedModCount,但是调用remove方法的时候modCount++,但是expectedModCount没有改变,两个Count值不相等,由此抛出异常。所以不必赘述,使用iterator遍历删除的话,也会出现相同的错误。

特别地

根据经验判断只有删除倒数第二个元素的时候不会抛出异常,删除其他元素都会抛出异常,此处就不再去追究原因。如下代码演示(将上述代码中deleteString从"del"换成"fhd")以及结果:

1
deleteString = "fhd";
forLast2delete

正确方法

创建一个作为条件判断的List

1
2
3
4
5
6
7
List<String> res = new ArrayList<String>();
for (String s : lists)
res.add(s);
for (String s : res) {
if (s.equals(deleteString))
lists.remove(s);
}

使用removeIf方法

1
lists.removeIf(string->string.equals("deleteString"));

其中 -> 后面的是判断条件,符合条件的string就删除。


关于HashMap方法的总结

java HashMap 插入重复key

在解释插入重复key会发生什么之前,不妨先了解一下HashMap是怎么储存和运行的。

储存 :首先对于一对key和value,调用key的hashCode()方法得到对应的bucket位置,相同hashcode的Key就储存在同一个bucket中。但HashMap并不是直接储存,而是每一个bucket都对应一个LinkedList or as Entry,如下所示。由此,相同hashcode的key放在同一LinkedList上。

HashMap

put()方法的实现 :首先得到待插入key的hashcode,根据此找到插入位置所在的LinkedList,之后会通过equals(key)方法判断是否存在键值对。对于重复的key和value,会用new value覆盖value,并返回old value;若之前不存在相应key,则返回null,这样就实现了key的唯一性。

浅拷贝与深拷贝

  • 浅拷贝 :HashMap的浅拷贝结果映射到与原始HashMap相同的key和value对象。
  • 深拷贝 :HashMap的深拷贝可以深入复制所有映射,为所有key、value和映射创建新对象。

shallow copy examples

1.HashMap clone() method

1
HashMap<String, int> shallowCopy = originalMap.clone();

2.putAll() method shallow-copies all of the mappings in one step.

1
2
HashMap<String, int> shallowCopy = new HashMap<>();
shallowCopy.putAll(originalMap);

3.put() method by iterating over each entry and calling the put() method on another map.

1
2
3
4
5
HashMap<String, int> shallowCopy = new HashMap<String, int>();
Set<Entry<String, int>> entries = originalMap.entrySet();
for (Map.Entry<String, int> mapEntry : entries) {
shallowCopy.put(mapEntry.getKey(), mapEntry.getValue());
}

deep copy examples

serialization--java序列化

Use Google Gson library/ Alibaba to serialize the HashMap and deserialize.