A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

初学java基础课程,在学习完面型对象,字符串缓冲类,集合和IO流之后,我们学习了第一个看上去很高端的项目—IO版学生信息管理系统。下图借用课上老师绘制的该系统的结构图来进行讲解。

1 当不引入IO流时,我们用集合来实现学生信息管理,这种方式有个弊端就是:所有的信息都是在内存中管理的,当程序结束后,所有的学生信息都不存在了。学完IO流后我们想把学生信息存储在一个文件中,这样在程序关闭并再次打开后,我们可以通过文件直接读取学生信息。
2 引入IO流后的整体思想变化不大,主要是把数据的最终存储地从集合换成了文件,而集合充当中间的媒介,程序对学生信息的增删改查都需要经过集合。例如:查询学生信息时,需要先把磁盘文件中的数据读入到内存集合中,再打印到控制台;增改删时,需要先把磁盘文件中的数据读入到内存集合中,然后对集合中的学生信息进行增改删,最后再把集合中的学生信息写入到文件中。
3 有了上述思想我们可以去完成这个IO版的学生信息管理系统。课堂上,老师定义了两个方法public static voidwriteData(String fileName,ArrayList<Student> array)和public static void readData(String fileName,ArrayList<Student>array)用来完成集合和文件之间的写数据和读数据。然后把这两个方法加入到增删改查这四个方法中。值得注意的是,这种方式只在主函数中定义了文件路径,没有定义集合,集合是在增删改查四种方法中新建的,那么问题就来了。


4 java中一大特性就是垃圾回收机制。堆中的对象在失去所有的引用后由系统在空闲时主动回收。这样一来,我们在频繁调用增删改查方法时就会在堆内存中产生很多集合对象,虽然在方法结束后对象的引用被释放,但该对象所占的内存何时被释放是不确定的。假设我们管理的是成千上万个的学生信息,在程序使用时就会产生很多垃圾。
5 那如何优化呢?我们再次回顾这个系统的流程。集合充当的角色是什么?集合在每次增删改查进行时第一步都要从文件中读取数据,在查询后不需要往文件中写数据,在删改查过后需要往文件中写数据。因为这个系统中的四个基本方法(增删改查)之间不存在相互调用,所以我们可以在主函数中创建一个集合对象,在之后的方法中把这个对象的引用当作参数来传递。
6 在集合对象的引用作为参数传递时,需要注意一些问题。何时清空集合?每个方法在开始时,集合应该是空的,所以在每个方法结束前应该把集合清空,包括查询方法。因此在查询,删除,修改这三个方法的结尾需要调用集合的clear()方法清空集合。这里还需要注意增加方法,增加方法的实现思路是先判断有没有重复的学号,如果有就重新输入学号,如果没有就添加学生元素。那么当输入学号重复时又返回到添加方法的头部循环处,这时集合不需要重新读取文件中的数据,因此也不能清空。所以在添加方法中,只在成功添加并且写入文件后才清空集合。

这是自己在看书时存在的疑惑,通过代码实现后发现在主函数中定义集合并传参也是可以实现系统功能的。最后附上修改前后的代码,如果读者发现有错误请联系作者。

code.zip (4.16 KB, 下载次数: 52)

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马