概念理解
构建键值对不一定要建立map,也可以使用数组,如LeetCode645错误的集合。
两个对象即便是内容相同,它的hash值也是不同的,除非子集重写hash方法。如AAAA365. 水壶问题
题型总结
原地哈希
- AAAA41. 缺失的第一个正数
- AAAA442. 数组中重复的数据
把当前元素作为下标,标记下标对应的元素,从而判断哪些元素已经出现过一次。
元素匹配
- *290. 单词规律
用两个map存储字符对字符串的映射,字符串对字符的映射,有不一致的就是错的。
也可以用一个map实现,判断key存不存在,也判断值存不存在。 - AAA*448. 找到所有数组中消失的数字
借助原数组的下标标记一个数是否存在。 - AAA6092. 替换数组中的元素
用哈希表的值存储数组的下标,更新哈希表的健,最后再次遍历哈希表可以还原整个数组。 - AAAA890. 查找和替换模式
只需要判断相同的字母是不是映射成了相同的字母就能知道是否匹配
技巧/API
Pair<T,T>
Pair是一对值,Map是集合
import javafx.util.Pair;
Pair<Integer, String> pair = new Pair<>(1, "One");
Integer key = pair.getKey();
String value = pair.getValue();
Set
只要放在TreeSet中的元素对象,在该对象的类中必须实现Comparable接口,必须覆盖该接口中的compareTo()方法,并在该方法中编写比较规则。(该方法不能自动生成)
自然排序: 自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序
比较器排序: 创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序
TreeSet的自然排序和定制排序
TreeSet集合中自然排序和比较器排序概述和总结
迭代器
- *341. 扁平化嵌套列表迭代器
会用迭代器使代码更加简洁
java.util.ConcurrentModificationException
并发模式下,使用迭代器遍历集合,集合的remove方法可能会报java.util.ConcurrentModificationException
。
原因是:
ArrayList的remove方法修改的变量是继承自AbstractList的变量modCount;而Itr的remove方法修改的是自身的变量expectedModCount。这两个变量的作用都是记录修改次数的。
在用ArrayList进行删除操作以后,modCount改变了,但是迭代器中的expectedModCount 还是原样不动。所以,在用ArrayList的remove方法进行删除操作以后,Itr里面的expectedModCount会与ArrayList的modCount进行比较,二者不相等,所以会抛错。
原文链接:https://blog.csdn.net/qq_35056292/article/details/79751233
解决办法使用迭代器的删除方法iterator.remove()
,iterator.remove()会调用集合的remove方法。