第三阶段 JAVA常见对象的学习
集合框架——List接口
按照集合框架的继承体系,我们先从Collection中的List接口开始学习
(一) 概述及功能(ArrayList演示)
(1) 概述
List在Collection中充当着一个什么样的身份呢?——有序的 collection(也称为序列)
实现这个接口的用户以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。与 set 不同,列表通常允许重复的元素。
(2)List集合功能
A:基本功能:(继承而来)
//添加功能
B:特有功能:
A:add() 使用方法:
我们还是先写一个List遍历字符串的代码
import
通过这段代码我们可以看到,List集合的特点——有序(存储和去取出的元素一直),可重复
我们再使用List存储学生对象并遍历看看
//Student 自行补充
B:add() 使用方法:
package
上面几个实例中,我们使用了Iterator迭代器遍历,下面我们介绍一种特别的迭代器
C: 列表迭代器:
ListIterator listIterator():列表迭代器:List集合特有的迭代器
列表迭代器继承于Iterator迭代器,可以直接使用hasNext() 和next()方法
基本功能:
//将指定的元素插入列表(可选操作)
特有功能:
//获取上一个元素
列表迭代器的好处是相比Iterator提供了更多的方法,并且可以实现正向遍历,才能逆向遍历,所以一般来说意义不大。
import
(二) 并发修改异常问题
我创建了一个集合,并且遍历它,使用if语句判断 是否集合中存在"love"这个字符串,若存在,就增加一个"❤"元素,我们先顺着这个思路写一下代码:
import
我们贴出JDK中对这个异常的解释:
This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible.
当不允许这样的修改时,可以通过检测到对象的并发修改的方法来抛出此异常。
(1) 原因解释:
当我们对集合进行遍历的时候,我们会获取当前集合的迭代对象
//List为例,获取集合的迭代对象
这个迭代对象中,封装了迭代器的方法与集合本身的一些方法,当我们在迭代中使用集合本身的add方法的时候,就产生了ConcurrentModificationException异常,通俗的说就是,在判断成功后,集合中元素增加了,但是迭代器不清楚,所以就报错,如果迭代器中含有这一种方法(假设),我们是用迭代器添加元素就不会有问题了。
针对这个问题,我们给出两个解决方案
(2) 解决方案:
方式1:迭代器迭代元素,迭代器修改元素
我们假想如果Iterator迭代器中有添加功能就好了,但很遗憾并没有,但是它的子接口ListIterator却拥有这个功能
import
2:集合遍历元素,集合修改元素(普通for)
import
两者均可以解决并发修改异常的问题,但是通过运行结果也可以看出,方法一添加后,在本次遍历中不会输出添加的结果,而方法二却可以。
补充:增强for循环实现将集合进行遍历,也产生了并发修改异常,这是因为增强for在底层也是调用的集合本身的remove
(3) 总结:
在迭代器遍历时,如果需要对集合进行增删操作时,要调用迭代器本身的remove方法,或者选择使用普通for进行遍历
(三) Vector (过时,不推荐)
特有功能
(四) List案例练习
下面的案例题目个别来源于网络,我们来整理,书写一下。
案例(一):集合嵌套存储和遍历元素的案例
需求:
我们班有学生,每一个学生是不是一个对象。所以我们可以使用一个集合表示我们班级的学生。ArrayList<Student>
但是呢,我们旁边是不是还有班级,每个班级是不是也是一个 ArrayList<Student>
而我现在有多个ArrayList<Student>。也要用集合存储,怎么办呢 ?
按照我们的想法就是这个样子的:ArrayList<ArrayList<Student>>
案例 (二): 获取10个1-20之间的随机数,要求不能重复
package
案例 (三) 键盘录入多个数据
键盘录入多个数据,以0结束,要求在控制台输出这多个数据中的最值
package
案例 (五) 登录注册案例(使用集合)
package
package
因为注册的时候很可能还要填写例如地址,性别,爱好等等信息(而登录功能的时候往往只需要用户名和密码),所以这个注册功能传进来的参数过多,因此用对象代替过多的参数,也就是说,通过传递对象(User user)包含众多信息避免了直接传递String username,password等等变量过多的问题
package
package
小结:
dao层主要连接数据库,封装增删改查的数据库语句
daoimpl是实现dao层方法的接口,所以可以把具体实现的方法写在daoimpl中,dao层只写方法名就可以。
Pojo代表简单的Java对象
(五) List子类的特点(总结)
ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
使用具体情况:
保证安全:Vector
(即使要安全,也不用这个,后面有替代的)
不保证安全:ArrayList或者LinkedList
查询多:ArrayList
增删多:LinkedList
结尾:
如果内容中有什么不足,或者错误的地方,欢迎大家给我留言提出意见, 蟹蟹大家 !^_^