目录:情景导入

List集合根据角标存取元素

迭代删除元素并发异常

List集合解决添加元素并发异常

1.情景导入图片出自高新强老师Java网课

我的上一篇知乎大概了解了一下Collection接口的一些基本内容,本次我们关注一下继承了Collection接口的List接口。

我们同样是new一个接口的实现类来探讨。List接口中同样可以使用所有Collection中的方法,并且它也有一些自己的特殊方法。

2.List集合根据角标存取元素存元素

这种根据角标的添加方式是List特有的,Set没有。Set是无序的,根本没有角标这个概念。

List集合的特有方法

注意:这里的角标必须<=size 如果大于size就会在运行时报错

报数组越界IndexOutOfBoundsException取元素

其实和上面操作基本一样,这里顺便给出一个遍历操作

注意:这里不能写<= 否则会越界

3.迭代删除元素并发异常

现在我们简单的用迭代器遍历一下List集合,并将等于2的元素删除

这串代码是不是看起来没什么问题?

——然而他报错了!

这个错叫做‘并发修改异常’

让我们仔细分析一下。首先上个简单的结论:并发修改异常

在迭代集合的过程中,是不允许直接修改集合结构的

本例中我们在迭代过程中删除了集合中的元素 因此报错如何解决这个问题?迭代器给了我们一个用来删除元素的方法remove

我们使用这个方法就不会报错

这个方法不需要填角标,

它会删除当前刚好取出的元素,专业点说就是删除当前正在迭代集合的元素那么具体是咋回事?——分析内部源码

我们进到我们的接口实现类ArrayList里面 找到next()方法

每次在调用next的时候,他都会检查一个啥玩意儿

我们进到这个检查方法里面

这个方法里面有两个常量,一个叫modCount,另一个叫expectedModCountmodCount:集合修改次数

expectedModCount:迭代器中记录的 集合修改的次数

创建迭代器时,会把modCount的值赋给expectedModCount。

一开始这哥俩是相等的,一旦不相等 check方法就会抛出‘并发修改异常’

在本例中,我们一开始add了四个元素,所以modCount的值为4

调用list.iterator();方法时,将modCount的值赋给expectedModCount,

此时他俩相等,it.next()方法可以正常执行

在第一次循环中,我们调用了list.remove()方法,这个方法是list的,不是迭代器给我们的it.remove()。我们此时修改了一次集合,使modCount的值加一变成了5.

在第二次循环执行it,next()方法时,modCount=5,而expectedModCount=4,俩值不相等,因此抛出‘并发修改异常’为什么迭代器自带的remove方法就可以修改呢?其实你仔细一想就能明白,肯定是他内部帮我们顺便修改了expectedModCount呗

我们只需要关心try中的最后一句话 果然就是它又进行了一次赋值 2333

既然执行完remove后 他俩的值又一样了 那么下一次调用it.next自然就不会报异常咯

现在我们已经会迭代删除元素了,接着 我们抛出一个问题:如何迭代增加元素?

这不是一样的嘛?——其实不一样。

因为——迭代器里面就这几个方法,已经被我们用完了,迭代器没有给我们自带添加方法 233

那么 下一个标题 我们就讨论一下这个问题

4.List集合解决添加元素并发异常

我们刚才一直调用的迭代器都是Collection里面的迭代器,

其实List集合也给我们了一个迭代器

我那们进这个listIterator()看看呗

其实就跟 Collection里面的方法差不多 都是给我们返回了一个对象。

Collection里面那个叫Itr,这玩意儿叫ListItr。嗯,这名字没毛病

这玩意儿继承了Itr 并且还额外实现了一个接口ListIterator

这意味着它不但拥有父类Itr里面的全部方法 还拥有自己的一些特有的方法

如果要总结一下有什么特别的方法的话:那就是 ListItr前后都能取值

与next和hasNext相对应 它多了previous和hasPrevious方法

并且 除了remove之外 也多了set设置值 和add添加值 两个方法

那么既然有了add方法 那么要实现3标题末尾提出的问题 就很easy啦

java import list_Java中的List集合相关推荐

  1. java list_java中的list集合

    Java 集合 java集合概览 几幅图让你认识Java集合 java中List.Array.Map.Set等集合相互转换的最佳方法 关于Java集合最被关注的10 个问题 本列表会不断更新 文章 s ...

  2. java 删除list_Java中如何优雅地删除List中的元素

    在工作中的许多场景下,我们都会使用到List这个数据结构,那么同样的有很多场景下需要删除List中的某一个元素或某几个元素,那么我们该如何正确无误地删除List中的元素的,今天我来教大家三种方式. 前 ...

  3. java遍历list_Java中四种遍历List的方法总结(推荐)

    实例如下: package com.ietree.basic.collection.loop; import java.util.ArrayList; import java.util.Iterato ...

  4. java 实例化list_java中List的用法和实例详解

    List的用法 List包括List接口以及List接口的所有实现类.因为List接口实现了Collection接口,所以List接口拥有Collection接口提供的所有常用方法,又因为List是列 ...

  5. JAVA集合框架中的常用集合及其特点、适用场景、实现原理简介

    JDK提供了大量优秀的集合实现供开发者使用,合格的程序员必须要能够通过功能场景和性能需求选用最合适的集合,这就要求开发者必须熟悉Java的常用集合类.本文将就Java Collections Fram ...

  6. java 大数 list_Java后台通过Collections获取list集合中最大数,最小数代码

    Java后台通过Collections获取list集合中最大数,最小数代码,平均数,偏差,标准,总和,代码 Java后台通过Collections获取list集合中最大数,最小数代码 易采站长站,站长 ...

  7. java方法返回list_Java中List集合的常用方法

    List List接口是继承Collection接口,所以Collection集合中有的方法,List集合也继承过来. 常用方法: void add(int index, E element) 在指定 ...

  8. java取list中最大数值_Java后台通过Collections获取list集合中最大数,最小数代码

    我就废话不多说了,大家还是直接看代码吧~ package com.jalor; import java.util.ArrayList; import java.util.Collections; im ...

  9. Java并发编程(8):多线程环境中安全使用集合API(含代码)

    在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对 ...

  10. 【Java并发编程】之八:多线程环境中安全使用集合API

    在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对 ...

最新文章

  1. JAVA实现长连接(含心跳检测)Demo
  2. 谈谈几个 Spring Cloud 常见面试题及答案
  3. [CF494D]Birthday
  4. Focal Loss 的Pytorch
  5. 淘淘商城项目过程记录
  6. arcengine根据属性高亮显示图像_新品发布艺卓推出300万像素彩色医疗显示器RX360...
  7. WPF Datagrid合并表头的思路
  8. java去除不为null,java – 选择特定字段不为NULL的所有记录
  9. Java笔记-springframework.ws中拦截器的使用(SOAP)
  10. Linux C基础笔记(2)
  11. sympy模块解指数方程
  12. 【双十一特辑】爱心代码(程序员的浪漫)-李峋
  13. HCIP-RS-H12-221题库以及解析(部分)
  14. 微信小程序列表局部(单条)刷新
  15. 在设计四人抢答器中灯全亮_四人智力竞赛抢答器最终版(资料4)
  16. 结构方程模型(SEM)理论篇 (SEM 1)
  17. 电脑白屏,电脑白屏是怎么回事?是系统的原因还是
  18. (一)D3D9渲染原理
  19. 计算机的屏幕多少平方,27寸电脑显示器一般长宽各是多少厘米?
  20. MongoDB3.4 根据中文拼音给中文排序

热门文章

  1. PTN OAM交互接口设计
  2. 设置源ARM中断处理_S3C2440
  3. Predictably Irractional - 所有权的高昂代价
  4. ​​公众平台测试账号 开通 配置
  5. Bootstrap3的简单入门
  6. JDK11即将来临,新特性了解一下
  7. vue中接收到后台数据再回显到输入框时无法修改
  8. Python使用matplotlib可视化模拟学生课程分数雷达图
  9. ajax方法参数详解
  10. Layui 数据表格复杂表头