《疯狂 Java讲义(第二版)》

第1章 Java语言概述

1.1 Java语言的发展简史

第8章 Java集合体系

8.1 简述

Java 集合,就是一个容器,我们可以把多个对象丢到该容器中。在Java 5之前,集合会丢弃容器中对象的数据类型,所有对象就会当成Object类型进行处理。在Java 5增加泛型后,集合就记住了对象的数据类型,从而可以编写出更加简洁、健壮的代码。

Java集合 = Set + List + Map + Queue(Java 5增加)

集合特点
Set无序、不可重复
List有序、可以重复
Map映射关系
Queue队列

集合和数组的区别

  • 数组长度不变;集合长度可变
  • 数组无法保存映射关系;集合可以保存映射关系(Map)
  • 数组元素既可以是基本数据类型,也可以是对象;集合元素只可以是对象

8.2 Collection 和 Iterator

8.2.1 Collection

Collection接口是Set、List和Queue的统一父接口,定义了统一的集合操作方法。

方法功能描述
boolean add(Object o)向集合里添加一个元素。如果集合对象被添加操作改变了,则返回true
boolean addAll(Collection c)把集合c里的所有元素添加到指定集合里。如果集合对象被添加操作改变了,则返回true
void clear()清除集合里的所有元素,将集合长度变为0
boolean contains(Object o)判断集合里是否包含指定元素
boolean containsAll(Collection c)判断集合里是否包含集合c里的所有元素
boolean isEmpty()返回集合是否为空。当集合长度为0时返回true,否则返回false
Iterator iterator()返回一个Iterator对象,用于遍历集合里的元素
boolean remove(Object o)删除集合中的指定元素o,当集合中包含了一个或多个元素o时,这些元素将被删除,该方法将返回true
boolean removeAll(Collection c)从集合中删除集合c里包含的所有元素(相当于用调用该方法的集合减集合c)
boolean retainAll(Collection c)从集合中删除集合c里不包含的元素(相当于把调用该方法的集合变成该集合和集合c的交集)
int size()返回集合里元素的个数
Object[] toArray()把集合转换成一个数组,所有的集合元素变成对应的数组元素

注意

当输出一个集合时,会输出集合中具体的元素,这是因为所有Collection的实现类都重写了toString()方法

8.2.2 Iterator

Iterator接口虽然是Java集合体系中的成员,但是它不是用来盛装集合元素的,而是用来**遍历(迭代访问)**集合元素的。

方法功能描述
boolean hasNext()如果被迭代的集合元素还没有被遍历,则返回true
Object next()返回集合里的下一个元素
void remove()删除集合里上一次next方法返回的元素。

注意

当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何影响。


这里的描述其实不准确。Iterator在对集合进行迭代时,其实是把元素的地址传给了迭代变量。如果你的修改是修改了迭代变量的指向地址(比如List<String>),这对元素本身是没有影响的;如果你的修改是迭代变量指向地址的内容,那就对集合是有影响的。
重点理解:堆栈的关系

当使用Iterator迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只有通过Iterator的remove方法删除上一次next方法返回的集合元素才可以;否则将会引发java.util.Concurrent ModificationException异常。


这里的描述错误,集合中的元素是可以修改的,具体看上面解释。

Iterator迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到该集合已经被修改(通常是程序中的其他线程修改),程序立即引发ConcurrentModificationException异常,而不是显示修改后的结果,这样可以避免共享资源而引发的潜在问题。


检测的时机是在调用next()方法的时候。这里说的修改是增加、删除元素,并不是修改元素的内容。

代码链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
本光盘是《疯狂Java讲义》一书的配书光盘,书中的代码按章、按节存放, 即第3章第1节所使用的代码放在codes文件夹的03\3.1文件夹下,依此类推。 另:书中每份源代码也给出与光盘源文件的对应关系,方便读者查找。 本光盘codes目录下有18个文件夹,其内容和含义说明如下: (1) 01~18文件夹名对应于《疯狂Java讲义》中的章名, 即第3章所使用的代码放在codes文件夹的03件夹下,依此类推。 (2) 本书所有代码都是IDE工具无关的程序,读者既可以在命令行窗口直接编译、 运行这些代码,也可以导入Eclipse、NetBeans等IDE工具来运行它们。 (3) 本书第12章第11节的TestTableModel.java程序,以及第13章绝大部分程序 都需要连接数据库,所以读者需要先导入*.sql文件中的数据库脚本,并修改 mysql.ini文件中的数据库连接信息。连接数据库时所用的驱动程序JAR文件 为mysql-connector-java-3.1.10-bin.jar文件。这些需要连接数据库的程序 里还提供了一个*.cmd文件,该文件是一个批处理文件,运行该文件可以运行 相应的Java程序,例如DatabaseMetaDataTest.java对应的*.cmd文件为 runDatabaseMetaDataTest.cmd。 (4) 光盘根目录下提供了一个“Java设计模式(疯狂Java联盟版).chm”文件,这是一份 关于设计模式的电子教材,由疯狂Java联盟的杨恩雄亲自编写、制作,他同意广 大读者阅读、传播这份开源文档。 (5) 因为本书第1版有些读者提出关于《疯狂Java讲义》课后习题标准答案的问题, 因此本书光盘根目录下包含一个project_codes文件夹,该文件夹里包含了疯狂 Java联盟的杨恩雄编写的《疯狂Java实战演义》一书的光盘内容,该光盘中包 含了大量实战性很强的项目,这些项目基本覆盖了《疯狂Java讲义》课后习题 的要求,读者可以参考相关案例来完成《疯狂Java讲义》的课后习题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值