胡建華,鄢 旭
(1.浙江農(nóng)林大學(xué)暨陽學(xué)院 工程技術(shù)系,浙江 諸暨 311800;2.江西旅游商貿(mào)職業(yè)學(xué)院 現(xiàn)代教育技術(shù)中心,江西 南昌 330000)
Java語言課程中,集合框架是學(xué)生反映較難掌握的內(nèi)容之一。該部分提供了很多接口與類,List、ArrayList、LinkedList、HashMap、TreeMap 等,如這些類的區(qū)別在哪里,在什么情況下使用,這些問題時常困擾著學(xué)生。筆者發(fā)現(xiàn)很少有教材從理論的高度對Java集合框架進行清晰闡述,絕大部分教材只是羅列每個類的屬性與方法,沒有解釋每個類的區(qū)別及應(yīng)用場景;少數(shù)教材簡單說明ArrayList、LinkedList的實現(xiàn)方法不同,但不夠全面,也沒有說明一個集合對象保存的并不是元素的內(nèi)容,而只是元素對象的引用(可以理解為地址)。在多年的Java語言課程教學(xué)中,筆者發(fā)現(xiàn)從數(shù)據(jù)結(jié)構(gòu)理論角度介紹Java集合框架組成,以JVM簡化內(nèi)存模型描述集合對象的實現(xiàn),能幫助學(xué)生輕松理解Java集合框架,并靈活應(yīng)用,取得了較好的教學(xué)效果。
要從數(shù)據(jù)結(jié)構(gòu)理論的角度理解Java集合框架,第一步是回顧數(shù)據(jù)結(jié)構(gòu)課程的內(nèi)容。數(shù)據(jù)結(jié)構(gòu)是一門研究非數(shù)值計算問題中數(shù)據(jù)的組織、存儲及操作的學(xué)科。所謂非數(shù)值計算問題,指不是一個公式就能解決的問題,比如排序問題等。首先講解數(shù)據(jù)的組織、存儲及操作,見表1。
表1 數(shù)據(jù)的組織、存儲及操作
接著,講解集合、線性結(jié)構(gòu)、線性表、順序表、鏈表的區(qū)別。集合是一批數(shù)據(jù)(可以無序);線性結(jié)構(gòu)把一批數(shù)據(jù)組織起來,除了首元素與尾元素,中間任何一個元素只有一個前驅(qū)、一個后繼。從操作受限的角度看,線性結(jié)構(gòu)可分為線性表、隊列與棧3種,線性表就是操作不受限的線性結(jié)構(gòu)。從存儲的角度看,順序存儲的線性表叫順序表,鏈?zhǔn)酱鎯Φ木€性表叫鏈表。
最后,引導(dǎo)學(xué)生分析順序表與鏈表在訪問、插入、刪除一個元素時的效率區(qū)別。
第二步,講解Java的集合框架組成,見圖1。
明確告訴學(xué)生,Collection接口就是數(shù)據(jù)結(jié)構(gòu)中集合的抽象,該接口提供的方法,就是要完成數(shù)據(jù)結(jié)構(gòu)中集合的常用算法,諸如建立集合、插入元素、刪除元素、集合的交叉并補運算等。針對不同存儲結(jié)構(gòu)有不同的實現(xiàn)方式,這些方法都是抽象方法,具體由它的子類實現(xiàn),因此Collection定義成接口。
圖1 Java的集合框架組成
ArrayList類用順序存儲方式實現(xiàn),ArrayList就是順序表;LinkedList用鏈?zhǔn)酱鎯Ψ绞綄崿F(xiàn),LinkedList就是鏈表;兩者的區(qū)別在于訪問、插入、刪除一個元素時,效率是不同的。若一個集合經(jīng)常要插入、刪除元素,則LinkedList效率高。
Set就是在數(shù)據(jù)結(jié)構(gòu)集合的基礎(chǔ)上加了唯一性要求;當(dāng)Map把鍵—值看做一個整體時,它就是集合,并提供了項集。
進一步講解,HashSet、HashMap等是無序集合,TreeSet、TreeMap是通過二叉排序法建立的有序集合。
也許受到C語言課程中數(shù)組元素分配內(nèi)存空間的影響,很多學(xué)生認(rèn)為集合中保存了元素對象本身,因此他們不理解一個對象加入兩個集合等問題。一個集合中刪除了這個元素對象,為什么另一個集合還能顯示這個對象呢?所以,Java教學(xué)中,理解Java的內(nèi)存管理是很重要的。Java實際的內(nèi)存管理比較復(fù)雜,但可以用簡化的方式描述,既便于學(xué)生理解,又不違背Java內(nèi)存管理原則 ??梢院唵蔚匕褍?nèi)存分為兩部分:類區(qū)與對象區(qū)。下面用簡化內(nèi)存模型分析一段Java集合代碼。
list使用類中,main方法的簡化內(nèi)存模型分析見圖2。
由圖2可見,張三、令狐沖兩個學(xué)生對象是獨立建立在對象區(qū)的,jsj.add(xs1)只是通過調(diào)用add方法,把張三這個學(xué)生對象的地址加入到集合對象jsj中。jsj中刪除了一個學(xué)生對象,只是刪除了對這個對象的引用,這個對象本身還在內(nèi)存中。
圖2 main方法的簡化內(nèi)存模型分析圖
通過與數(shù)據(jù)結(jié)構(gòu)知識相結(jié)合,可以用簡化內(nèi)存模型分析集合代碼,幫助學(xué)生輕松掌握J(rèn)ava集合框架的本質(zhì),而不會迷惘于成堆的接口和類中。學(xué)院2015級學(xué)生按此方法教學(xué),該門課程平均成績達到85分,而前一屆學(xué)生未采用這種講課方法,同樣試卷考試,課程平均成績只有70分。由此可見,采用本文這種類比式教學(xué)方法后,教學(xué)效果提高顯著。
[1] 董東. 數(shù)據(jù)結(jié)構(gòu)與Java面向?qū)ο蟪绦蛟O(shè)計課程之間的有效銜接[J]. 計算機教育, 2015(15): 82-84.
[2] 宋晏. 基于知識邏輯結(jié)構(gòu)與思維形式注記教學(xué)論的Java教學(xué)設(shè)計[J]. 工業(yè)和信息化教育, 2014(5): 68-74.