first blood
把一些学习工作以及吹水写到被gc过的公众号原因是。不再想把一些东西都埋在心里,但又不太喜欢主动告诉他人,之前博客的域名过期加上每次上传文章的过程太琐碎了(主要是没人care)。[夯实]系列,夯实基础。
guide
第一篇写的是集合原因是下面简单排错的历程:
先来看一段代码,爆红是因为阿里编程规范插件检测出在for-each中操作集合,并非编译不通过
运行:
很奇怪,点进remove方法:
发现并没有抛出什么异常,打开class文件看看:
for-each实际上是使用了迭代器,进去remove方法
最终删除实际上是fastRemove,进去看
注意这里对modCount进行了+1操作,当下一次循环到Integer next = iterator.next();
这一行,点next方法

显然,异常是从这里抛出的。
多提一嘴,modCount该属性在集合每次add操作时也会+1,所以执行到next方法时,modCount已经等于6了,经过一次remove,此时等于7。故下次进入next时校验不通过,抛出ConcurrentModificationException异常。
[夯实]Java集合
Java集合在工作中使用地非常多,使用时遇到不会的就查阅一波,然后哦的一声说原来是这样,之后便不了了之了,这次我想梳理一下集合知识点,深入了解学习,对集合恐惧-1。
overview
jdk1.8
produces,如Collection产生了Iterator(即Collection接口中有一个方法的返回值类型为Iterator),虚线空心三角为抽象类接口的继承关系(如ListIterator接口继承了Iterator),实线空心三角为普通类的继承关系,虚线框为接口or抽象类。
以小弟使用最多的ArrayList和HashMap看依赖图
Iterable
可得Iterable合Map是两个顶级接口。
Iterable
该接口有三个方法:
public interface Iterable<T> {
/**
* Returns an iterator over elements of type {@code T}.
* **返回迭代器**
* @return an Iterator.
*/
Iterator<T> iterator();
/**
* 看到Consumer就知道是jdk1.8之后的了,该方法对集合内的元素进行了操作
*/
default void forEach(Consumer super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
/**
* 没使过
*/
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
Iterator
Iterator这个类比较简单:
public interface Iterator<E> {
/**
* 是否还有下一个
*/
boolean hasNext();
/**
* 拿到下一个
*/