集合(上) Colection方法 并发修改异常

摘要:
且用户可以通过整数索引访问元素,并搜索列表中的元素。与Collection集合不同,列表通常允许重复的元素。

1. 内部类

1.1 内部类相关

1.1.1 概述

类里边还有一个类, 外边那个类叫做外部类, 里边那个类叫做内部类.

1.1.2 示例

下述代码只要能看懂就行了, 关于内部类, 实际开发中我们用的最多的就是匿名内部类

publicclassA {
publicclassB{

}
}

1.1.3 分类
  • 成员内部类

publicclassA { //外部类
publicclassB{ //成员内部类

}
}

  • 局部内部类

publicclassA { //外部类
//外部类的成员方法
publicvoidshow() {
//局部内部类
classB {

}
}
}

1.2 匿名内部类

1.2.1 概述

匿名内部类指的就是没有名字的局部内部类.

1.2.2 前提

必须有一个类(抽象类, 普通类均可), 或者接口.

1.2.3 格式

new类名或者接口名() {
//重写类或者接口中所有的抽象方法
};

1.2.4 本质

匿名内部类就是一个继承了类或者实现了接口的匿名的子类对象.

简单理解:

匿名内部类的本质就是一个子类对象.

1.2.5 使用场景

当对对象方法(即: 成员方法)仅调用一次的时候.

匿名内部类可以作为方法的实参进行传递.

1.2.6 示例

需求

定义Animal抽象类, 该类中有一个抽象方法eat().

在测试类的main方法中, 通过匿名内部类的形式创建Animal抽象类的子类对象.

调用Animal类中的eat()方法

参考代码

注意: 当接口或者抽象类中的抽象方法在3个(含)以下时, 就可以考虑使用匿名内部类的形式来创建对象了.

2. 集合

2.1 概述

集合是用来存储多个同类型数据的容器, 它的长度是可以变化的.

2.2 集合的体系图

记忆

集合的顶层都是接口, 其中Collection接口是单列集合的顶层接口, Map接口是双列集合的顶层接口.

Collection接口(单列集合)有两大子体系:

–List体系的特点是: 有序, 可重复.

–Set体系的特点是: 无序, 唯一.

一个小技巧: 以后但凡我们学习一个新的体系时, 都建议采用学顶层, 用底层的方式来学习.

解释: 因为顶层封装的是整个继承体系的共性内容, 而底层才是具体的实现, 体现.

3 Collection集合

3.1 概述

Collection集合是单例集合的顶层接口, 里边定义了所有单列集合都共有的内容.

3.2 创建Collection对象

因为Collection是接口, 所以不能直接通过new关键字来创建它的对象, 那它如何创建对象呢?

我们可以通过多态的方式, 创建其子类对象, 从而实现创建Collection接口对象. 代码如下:

Collection<String> list = newArrayList<String>();

解释:

集合后边的<数据类型>是泛型的意思, 泛型是用来限定集合中存储元素的数据类型的.

例如:

–Collection<String>说明集合中只能存储字符串.

–Collection<Integer>说明集合中只能存储整数.

泛型只能是引用数据类型, 且在实际开发中, 泛型一般只结合集合来一起使用.

3.3 案例一: Collection入门

3.3.1 需求

创建Collection集合对象, 用来存储字符串.

调用Collection接口的add()方法, 往上述集合中添加3个字符串, 内容如下:

"hello", "world", "java"

通过输出语句, 直接打印集合对象, 并观察结果.

3.3.2 参考代码

略.

3.4 Collection集合的成员方法

常用方法如下:

  • public boolean add(E e) 添加元素.
  • public boolean remove(Object obj) 从集合中移除指定的元素.
  • public void clear() 清空集合对象
  • public boolean contains(Object obj) 判断集合中是否包含指定的元素
  • public booleanisEmpty() 判断集合是否为空
  • public int size() 获取集合的长度, 即集合中元素的个数

需求

通过多态的形式, 创建Collection集合对象.

调用Collection接口的add()方法, 往上述集合中添加3个字符串, 内容如下:

"hello", "world", "java"

分别测试上述的6个成员方法.

参考代码

略.

3.5 案例二: 遍历集合

3.5.1 需求

通过多态的形式, 创建Collection集合对象.

调用Collection接口的add()方法, 往上述集合中添加3个字符串, 内容如下:

"hello", "world", "java"

通过迭代器遍历集合, 获取到每一个元素, 并打印到控制台上.

3.5.2 提示
  • Collection集合中的方法

publicIterator<E> iterator() //根据集合对象, 获取其对应的迭代器对象.

解释:

因为Iterator是接口, 所以这里返回的其实是Iterator接口的子类对象.

迭代器是依赖于集合而存在的.

  • Iterator迭代器中的方法

publicbooleanhasNext() //判断迭代器中是否还有下一个元素.
publicE next() //获取迭代器中的下一个元素.

3.5.3 参考代码

略.

3.6 总结: 集合的使用步骤

集合的步骤可以分为四大步三小步, 具体如下:

创建集合对象.

创建元素对象.

把元素添加到集合中.

遍历集合.

根据集合对象获取其对应的迭代器对象.

通过Collection#iterator()方法实现.

判断迭代器中是否有下一个元素.

通过Iterator#hasNext()方法实现.

如果有, 就获取该元素.

通过Iterator#next()方法实现.

3.7 案例三: 存储自定义对象并遍历

3.7.1 需求

定义一个学生类, 属性为姓名和年龄.

创建Collection集合, 用来存储学生对象.

往Collection集合中, 添加3个学生的信息.

通过迭代器, 遍历集合.

3.7.2 参考代码

略.

4. List集合

4.1 概述

有序集合(也称为序列), 该界面的用户可以精确控制列表中每个元素的插入位置。且用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。与Collection集合不同,列表通常允许重复的元素。

简单记忆:

List集合的元素特点是: 有序, 可重复, 元素有索引.

  • 有序: 指的是元素的存储顺序和取出顺序是一致的.
  • 可重复: 指的是List集合可以存储重复的元素.
  • 元素有索引: 指的是List集合中每个元素都是由索引的, 且索引是从0开始的.

4.2 案例一: List入门

4.2.1 需求

创建List集合, 用来存储字符串.

往List集合中添加4个字符串值, 分别是: "hello", "world", "java", "world"

通过迭代器, 遍历List集合, 获取每一个元素, 并打印到控制台上.

4.2.2 参考代码

略.

4.3 List集合特有的成员方法

4.3.1 常用方法
  • public void add(int index, E element)

解释: 在集合的指定位置(索引), 插入指定的元素, 索引越界会报IndexOutOfBoundsException异常.

  • public E remove(int index)

解释: 删除指定索引处的元素, 并返回被删除的元素, 索引越界会报IndexOutOfBoundsException异常.

  • public E set(int index, E element)

解释: 修改指定索引处的元素为指定的值, 并返回修改前的元素, 索引越界会报IndexOutOfBoundsException异常.

  • public E get(int index)

解释: 根据索引, 获取其对应的元素, 索引越界会报IndexOutOfBoundsException异常.

4.3.2 需求

创建List集合, 用来存储字符串.

往List集合中添加3个字符串值, 分别是: "hello", "world", "java".

演示上述的4个方法.

4.3.3 代码演示

略.

4.4 案例二: 遍历List集合

4.4.1 需求

创建List集合, 用来存储字符串.

往List集合中添加3个字符串值, 分别是: "hello", "world", "java".

通过for循环 + size() + get()的形式, 遍历List集合.

4.4.2 参考代码

略.

4.5 案例三: 存储自定义对象并遍历

4.5.1 需求

定义一个学生类, 属性为姓名和年龄.

创建List集合, 用来存储学生对象.

往List集合中, 添加3个学生的信息.

分别通过两种遍历方式, 来遍历List集合.

4.5.2 参考代码

略.

4.6 列表迭代器

4.6.1 概述

列表迭代器指的是ListIterator接口, 它是List集合特有的迭代器.

该迭代器继承了Iterator迭代器,所以, 我们可以直接使用.

4.6.2 成员方法解释
  • List集合中的成员方法

publicListIterator<E> listIterator() //根据List集合对象, 获取其对应的列表迭代器对象.

  • ListIterator迭代器中的成员方法

publicbooleanhasPrevious() //判断列表迭代器中, 是否有上一个元素.
publicE previous() //获取列表迭代器中的上一个元素.

4.6.3 案例: 列表迭代器入门

需求

创建List集合, 用来存储字符串.

往List集合中添加3个字符串值, 分别是: "hello", "world", "java".

通过列表迭代器对List集合分别进行正向遍历和逆向遍历.

参考代码

略.

记忆: 通过列表迭代器进行逆向遍历之前, 必须先进行一次正向遍历.

4.7 并发修改异常

4.7.1 需求

创建List集合, 用来存储字符串.

往List集合中添加3个字符串值, 分别是: "hello", "world", "java".

判断集合中是否有"world"元素, 如果有, 就往集合中添加一个"JavaEE".

4.7.2 参考代码

略.

4.7.3 问题描述

当使用普通迭代器(Iterator)遍历集合的同时, 又往集合中添加元素, 就会报并发修改异常.

4.7.4 产生原因

迭代器依赖于集合而存在, 在判断成功后, 集合中添加了新的元素, 而迭代器并不知道, 所以就报错了.

其实这个问题说的是: 迭代器遍历集合中的元素时, 不要使用集合对象去修改集合中的元素.

4.7.5 解决方案
  • 方案一: 通过列表迭代器解决

略.

注意:

必须使用列表迭代器中的添加元素的方法. 即: ListIterator#add()

这种方式添加的元素, 是跟在刚才迭代的元素后边的.

  • 方案二: 通过for循环 + size()解决

略.

注意: 这种方式添加的元素, 是在集合的最后位置添加的.

5. 增强for

5.1 概述

增强for是JDK1.5的新特性, 它是用来简化数组和Collection集合的遍历的.

5.2 格式

for(元素的数据类型 变量名 : 数组或者Collection集合对象) {
//上述的 变量名 代表的就是, 数组或者Collection集合中的每一个元素.
}

5.3 好处

增强for是用来简化数组和Collection集合的遍历的.

5.4 注意事项

要通过增强for遍历的数组或者Collection集合, 不能为null.

即: 增强for的目标要判断是否为null.

5.5 示例一: 遍历数组

5.5.1 需求

定义int类型的数组, 存储元素1, 2, 3, 4, 5.

通过增强for, 遍历上述的数组.

5.5.2 参考代码

略.

5.6 案例二: 遍历集合

5.6.1 需求

定义List集合, 存储字符串"hello", "world", "java"

通过增强for遍历上述的集合对象.

判断List集合中是否有"world", 如果有, 就往集合中添加元素"JavaEE".

5.6.2 参考代码

略.

结论(这个要求大家记忆):

增强for的底层其实是通过迭代器(Iterator)实现的.

5.7 案例三: 遍历集合

5.7.1 需求

定义学生类, 属性为姓名和年龄.

创建List集合, 用来存储学生对象.

往集合中添加3个学生的信息.

通过增强for遍历上述的List集合.

5.7.2 参考代码

略.

6. 常见的数据结构

6.1 概述

数据结构是计算机存储, 组织数据的方式. 它是指相互之间存在一种或多种特定关系的数据元素的集合. 通常情况下, 精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关.

大白话理解:

数据结构指的就是数据的组织方式.

6.2 常用的数据结构

  • 队列
  • 数组
  • 链表

6.3 栈和队列的图解

6.3.1 需求

我要把A, B, C三个元素存入到栈中, 流程是怎样的呢?

我要把A, B, C三个元素存入到队列中, 流程是怎样的呢?

6.3.2 图解

略.

6.4 数组和链表的图解

6.4.1 需求

假设有元素11, 22, 33, 44, 55, 分别通过数组和链表的图解模拟以下需求.

我要获取33这个元素, 怎么实现呢?

我要在33这个元素后面添加一个新元素88, 怎么实现呢?

我要删除33这个元素, 怎么实现呢?

6.4.2 图解

略.

7. List集合的子类

7.1 常用子类

List集合是一个接口, 它的常用子类有两个, 分别是ArrayList, LinkedList.

  • ArrayList集合的特点: 底层数据结构是数组, 查询和修改快, 增删慢.
  • LinkedList集合的特点: 底层数据结构是链表, 查询和修改慢, 增删快.

注意: 它们的相同点是, 都是有序的, 而且可以存储重复元素.

7.2 ArrayList集合

7.2.1 案例一: 存储字符串并遍历

需求

定义ArrayList集合, 存储3个字符串信息, 分别是: "hello", "world", "java".

通过三种方式, 遍历上述的集合.

提示: 迭代器, 普通for, 增强for.

参考代码

略.

7.2.2 案例二: 存储学生并遍历

需求

定义学生类, 属性为姓名和年龄.

创建ArrayList集合, 用来存储学生信息.

往集合中添加3个学生对象.

通过三种方式, 遍历上述的集合.

参考代码

略.

7.3 LinkedList集合

7.3.1 案例一: LinkedList入门

需求

创建LinkedList集合对象, 存储字符串数据: "hello", "world", "java"

遍历LinkedList集合.

参考代码

略.

7.3.2 LinkedList的特有方法

LinkedList集合主要是用来操作头和尾元素的, 所以它里边定义了大量这类的方法, 常用的方法如下:

  • public void addFirst(E e) 往列表的开头插入指定的元素
  • public void addLast(E e) 往列表的末尾插入指定的元素
  • public E removeFirst() 删除列表中的第一个元素, 并返回被删除的元素
  • public E removeLast() 删除列表中的最后一个元素, 并返回被删除的元素.
  • public E getFirst() 返回列表的第一个元素
  • public E getLast() 返回列表的最后一个元素
7.3.3 案例二: 常用方法演示

需求

创建LinkedList集合对象, 存储字符串数据: "hello", "world", "java"

分别演示上述的6个方法.

参考代码

略.

免责声明:文章转载自《集合(上) Colection方法 并发修改异常》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微信小程序仿系统预览大图功能syslogng配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Delphi国内优秀网站及开源项目

它被设计为与Delphi2010或更高版本一起使用,它使用了旧版Delphi中没有的语言/RTL功能。https://github.com/VSoftTechnologies/DUnitXDelphiIDEColorizerDelphiIDEColorizer是一个插件,它可以使RADStudioIDE的工作空间https://github.com/RRUZ...

boost的下载和安装(windows版)

1 Introduction boost是一个准C++标准库,相当于STL的延续和扩展。它的设计理念类似于STL,它使用泛型来最大化重用。对于2boost的下载和安装,我们可以在官方boost网站上下载最新的boost版本。因为boost库可以像标准库一样在多个平台上运行,所以它只以源代码的形式正式提供。这是因为boost windows的安装版本不仅与处理...

vue+jspdf+html2canvas导出PDF文件

没有废话。首先,查看最终打印结果。我说最后打印的pdf文件看起来像这样。pdf文件的分页是通过设置jspdf实现的,但我暂时无法对文件内容进行分页。因为我们首先将需要打印的元素转换为画布,然后将画布转换为图像,然后将图像转换为pdf文件。...

iReport制作报表,字数过多换行问题

1.当字段中显示的数据太长而无法放入表中时,需要自动换行。选择要更改的表(显示动态内容的字段),并将Stretchwithoverflow属性设置为选中。未选中前:选中后:2.然而,桌子坏了,非常难看。此时,我们需要设置一个属性,使同一行中的其他字段保持与换行字段相同的高度。此时,我们需要框选要显示在整行中的动态字段和表;将属性StretchType设置为R...

可爱猫+python——定制化微信机器人

框架是模拟真实用户操作,只要不违法乱纪,是不用担心账号冻结问题的。...

JRebel激活服务搭建

前言因为平时的开发工具是使用IntelliJIDEA,所以热部署项目代码的时候,使用的Jrebel。因为Jrebel是收费的,所以以前用的时候都是在网上找破解方法,在网上找到的办法是输入一个在线激活服务,来进行激活。由于简单方便就一直这样用的,今天早上打开IDEA后发现,Jrebel激活失效了。JRebel很好用,也是离不开大家的支持,所以如果条件允许的话,...