循环判断删除list元素
错误演示增强for循环
1 | List<String> lists = new ArrayList<String>(); |
删除元素后继续循环会报错误信息ConcurrentModificationException,如下图所示:
直接原因: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"; |
正确方法
创建一个作为条件判断的List
1 | List<String> res = new ArrayList<String>(); |
使用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上。
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 | HashMap<String, int> shallowCopy = new HashMap<>(); |
3.put() method by iterating over each entry and calling the put() method on another map.
1 | HashMap<String, int> shallowCopy = new HashMap<String, int>(); |
deep copy examples
serialization--java序列化
Use Google Gson library/ Alibaba to serialize the HashMap and deserialize.