accept 返回0_集合[0]

first blood
把一些学习工作以及吹水写到被gc过的公众号原因是。不再想把一些东西都埋在心里,但又不太喜欢主动告诉他人,之前博客的域名过期加上每次上传文章的过程太琐碎了(主要是没人care)。[夯实]系列,夯实基础。

guide

第一篇写的是集合原因是下面简单排错的历程:
先来看一段代码,爆红是因为阿里编程规范插件检测出在for-each中操作集合,并非编译不通过e475fa0c3d9afc301ddc354c4d50ab0f.png
运行:ad5cdf309113a4a3abb6a1bcabdb159e.png
很奇怪,点进remove方法:f4c833dd0c6e7a3e45e174f12780484b.png
发现并没有抛出什么异常,打开class文件看看:7aedf71a195d432b54429bf2ef0687df.png
for-each实际上是使用了迭代器,进去remove方法75d270dea1301842e655b4a4fd727753.png
最终删除实际上是fastRemove,进去看425fccb913ebb2851b0090ac2f4ff274.png

注意这里对modCount进行了+1操作,当下一次循环到Integer next = iterator.next();
这一行,点next方法6c806f35522df964512998ebc0784220.png45610dccdb78a2fbc3ee0583130aaa01.png
显然,异常是从这里抛出的。
多提一嘴,modCount该属性在集合每次add操作时也会+1,所以执行到next方法时,modCount已经等于6了,经过一次remove,此时等于7。故下次进入next时校验不通过,抛出ConcurrentModificationException异常。

[夯实]Java集合


Java集合在工作中使用地非常多,使用时遇到不会的就查阅一波,然后哦的一声说原来是这样,之后便不了了之了,这次我想梳理一下集合知识点,深入了解学习,对集合恐惧-1。

overview

jdk1.8a847372d05ded0131dbb6b60867f4342.pngproduces,如Collection产生了Iterator(即Collection接口中有一个方法的返回值类型为Iterator),虚线空心三角为抽象类接口的继承关系(如ListIterator接口继承了Iterator),实线空心三角为普通类的继承关系,虚线框为接口or抽象类。

以小弟使用最多的ArrayList和HashMap看依赖图08eab67edb500a1ff7b7700eba66a50d.pngff25791325411c24861be490bd6c9727.png

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();

/**
* 拿到下一个
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值