APP下载

基于数据结构与简化内存模型的Java集合教学方法研究

2018-06-01胡建华

计算机教育 2018年5期
关键词:链表数据结构内存

胡建华,鄢 旭

(1.浙江农林大学暨阳学院 工程技术系,浙江 诸暨 311800;2.江西旅游商贸职业学院 现代教育技术中心,江西 南昌 330000)

0 引 言

Java语言课程中,集合框架是学生反映较难掌握的内容之一。该部分提供了很多接口与类,List、ArrayList、LinkedList、HashMap、TreeMap 等,如这些类的区别在哪里,在什么情况下使用,这些问题时常困扰着学生。笔者发现很少有教材从理论的高度对Java集合框架进行清晰阐述,绝大部分教材只是罗列每个类的属性与方法,没有解释每个类的区别及应用场景;少数教材简单说明ArrayList、LinkedList的实现方法不同,但不够全面,也没有说明一个集合对象保存的并不是元素的内容,而只是元素对象的引用(可以理解为地址)。在多年的Java语言课程教学中,笔者发现从数据结构理论角度介绍Java集合框架组成,以JVM简化内存模型描述集合对象的实现,能帮助学生轻松理解Java集合框架,并灵活应用,取得了较好的教学效果。

1 Java的集合框架就是数据结构课程中集合的抽象

要从数据结构理论的角度理解Java集合框架,第一步是回顾数据结构课程的内容。数据结构是一门研究非数值计算问题中数据的组织、存储及操作的学科。所谓非数值计算问题,指不是一个公式就能解决的问题,比如排序问题等。首先讲解数据的组织、存储及操作,见表1。

表1 数据的组织、存储及操作

接着,讲解集合、线性结构、线性表、顺序表、链表的区别。集合是一批数据(可以无序);线性结构把一批数据组织起来,除了首元素与尾元素,中间任何一个元素只有一个前驱、一个后继。从操作受限的角度看,线性结构可分为线性表、队列与栈3种,线性表就是操作不受限的线性结构。从存储的角度看,顺序存储的线性表叫顺序表,链式存储的线性表叫链表。

最后,引导学生分析顺序表与链表在访问、插入、删除一个元素时的效率区别。

第二步,讲解Java的集合框架组成,见图1。

明确告诉学生,Collection接口就是数据结构中集合的抽象,该接口提供的方法,就是要完成数据结构中集合的常用算法,诸如建立集合、插入元素、删除元素、集合的交叉并补运算等。针对不同存储结构有不同的实现方式,这些方法都是抽象方法,具体由它的子类实现,因此Collection定义成接口。

图1 Java的集合框架组成

ArrayList类用顺序存储方式实现,ArrayList就是顺序表;LinkedList用链式存储方式实现,LinkedList就是链表;两者的区别在于访问、插入、删除一个元素时,效率是不同的。若一个集合经常要插入、删除元素,则LinkedList效率高。

Set就是在数据结构集合的基础上加了唯一性要求;当Map把键—值看做一个整体时,它就是集合,并提供了项集。

进一步讲解,HashSet、HashMap等是无序集合,TreeSet、TreeMap是通过二叉排序法建立的有序集合。

2 Java集合对象保存的是集合中每个元素对象的引用

也许受到C语言课程中数组元素分配内存空间的影响,很多学生认为集合中保存了元素对象本身,因此他们不理解一个对象加入两个集合等问题。一个集合中删除了这个元素对象,为什么另一个集合还能显示这个对象呢?所以,Java教学中,理解Java的内存管理是很重要的。Java实际的内存管理比较复杂,但可以用简化的方式描述,既便于学生理解,又不违背Java内存管理原则 。可以简单地把内存分为两部分:类区与对象区。下面用简化内存模型分析一段Java集合代码。

list使用类中,main方法的简化内存模型分析见图2。

由图2可见,张三、令狐冲两个学生对象是独立建立在对象区的,jsj.add(xs1)只是通过调用add方法,把张三这个学生对象的地址加入到集合对象jsj中。jsj中删除了一个学生对象,只是删除了对这个对象的引用,这个对象本身还在内存中。

图2 main方法的简化内存模型分析图

3 结 语

通过与数据结构知识相结合,可以用简化内存模型分析集合代码,帮助学生轻松掌握Java集合框架的本质,而不会迷惘于成堆的接口和类中。学院2015级学生按此方法教学,该门课程平均成绩达到85分,而前一届学生未采用这种讲课方法,同样试卷考试,课程平均成绩只有70分。由此可见,采用本文这种类比式教学方法后,教学效果提高显著。

[1] 董东. 数据结构与Java面向对象程序设计课程之间的有效衔接[J]. 计算机教育, 2015(15): 82-84.

[2] 宋晏. 基于知识逻辑结构与思维形式注记教学论的Java教学设计[J]. 工业和信息化教育, 2014(5): 68-74.

猜你喜欢

链表数据结构内存
蒙特卡罗模拟中基于双向链表的元胞链表方法
数据结构线上线下混合教学模式探讨
重典型应用,明结构关系
如何用链表实现一元多项式相加
为什么会有“数据结构”?
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
跟麦咭学编程
内存搭配DDR4、DDR3L还是DDR3?
C语言中指针链表的学习探讨