- 相關(guān)推薦
關(guān)于Java容器類學(xué)習(xí)心得體會(huì)
由于小編對(duì)C++比較熟悉,所以學(xué)習(xí)Java應(yīng)該重點(diǎn)體會(huì)Java帶來的新概念。本文基本上是Java標(biāo)準(zhǔn)庫中集合框架的基本概念,沒有例子。寫本文的目的在于方便小編很長時(shí)間后若是忘了這些東西可以通過這片文章迅速回憶起來。
1. 接口
整個(gè)Java容器類的基礎(chǔ)是容器接口(例如Collection,Map等接口),而不是類。使用接口的最大好處在于將容器的實(shí)現(xiàn)與容器的接口分開,這就意味著你可以使用相同的方法訪問容器而不用關(guān)心容器是由什么樣的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的。同樣,Iterator接口也使得用戶可以使用相同的方法訪問不同的容器類。以上這些是通用算法的基礎(chǔ)。China
1.1 Collection接口
Collection接口有如下基本方法:
boolean add(Object obj):如果添加對(duì)象后,集合確實(shí)發(fā)生了變化,則返回true;否則返回false
Iterator iterator():返回一個(gè)實(shí)現(xiàn)了Iterator接口的對(duì)象
此外,還有
int size(),boolean isEmpty(),boolean contains(Object obj),void clear()等許多有用的方法
1.2 Map接口
Map用于存放關(guān)鍵字/值對(duì)。有如下基本方法:
Object get(Object key)
Object put(Object key,Object balue)
Set keySet()
Set entrySet()
此外,還有其他有用的方法。
需要注意的是,從表面看它似乎就是一種由鍵值對(duì)構(gòu)成的集合,但實(shí)際上并不是這樣。不過另一方面假如將Map的某一部分看作集合,有時(shí)候也還是顯得非常方便的。換言之你可以創(chuàng)建一個(gè)集合用它來表達(dá)Map的那一部分。綜上所述,一個(gè)Map可以返回的東西包括它的鍵值構(gòu)成的一個(gè)Set、由它的值構(gòu)成的一個(gè)集合或者由它的鍵值對(duì)構(gòu)成的一個(gè)Set。
1.3 Iterator接口
Iterator接口有下面3個(gè)基本方法:
Object next():返回迭代器剛越過的元素的引用
boolean hasNext():判斷容器內(nèi)是否還有可供訪問的元素
void remove():刪除迭代器剛越過的元素
注意:Java中的迭代器與STL中的迭代器在概念上有很重要的區(qū)別。在STL中,迭代器類似于數(shù)組的索引,使用這種迭代器可以查看存放在該位置上的元素(類似于通過數(shù)組索引i來訪問c[i]一樣)。Java中的迭代器并不這樣運(yùn)行。查看與位置的變化緊密的結(jié)合在一起。每次通過next()訪問一個(gè)元素的同時(shí),迭代器的位置會(huì)自動(dòng)向前走一步。
這個(gè)問題可以這樣理解:Java中的迭代器指向的位置并不是元素,而是元素之間。這樣,每次調(diào)用next()時(shí),迭代器便越過下一個(gè)元素,同時(shí)返回它剛越過的那個(gè)元素的引用。
根據(jù)上面的說明,很容易得出下面的代碼是錯(cuò)誤的:
it.remove();
it.remove();
而下面的代碼是正確的:
it.remove();
it.next();
it.remove();
迭代器的典型應(yīng)用
Iterator it=c.iterator();
while(it.hasNext())
{
Object obj=it.next();
//do something with obj
}
1.4 子接口
1.4.1 List接口
List從Collection接口中分立出來是因?yàn)長ist的特點(diǎn)——有序的集合。這里指的有序并不是按照大小排好序的(Sorted),而是指集合是可以以確定的順序訪問的序列。針對(duì)List的這個(gè)特點(diǎn),它比Collection接口增加了通過索引進(jìn)行操作的方法。例如,add、remove、get、set等方法的參數(shù)表中都可以加入索引的數(shù)值,從而操作處在索引位置處的元素。
1.4.2 Set接口
Set與List的不同,它里面的元素是無序的;所以,不能通過任何索引的方法來操作Set對(duì)象China It Power . ComZKWED
1.4.3 ListIterator接口
使用與List的迭代器,比Iterator接口增加了一些方法(例如add()等)。此外,由于List是雙向表,所以還增加了Object previous()和boolean hasPrevious()方法,用法與next()和hasNext()一樣。China It Power . ComZKWED
1.4.4 SortedMap接口
包含如下基本方法:
Comparator comparator()
Object firstKey()
Object lastKey()China It Power . ComZKWED
2. 抽象容器類
2.1 抽象容器類包括AbstractCollection,AbstractList,AbstractSet等等China It Power . ComZKWED
2.2 為什么要有抽象結(jié)合類?
例如Collection接口中定義了許多有用的方法,如果實(shí)現(xiàn)Collection接口的每個(gè)類都自行實(shí)現(xiàn)這么多的方法,那將是非常麻煩的。為了使實(shí)現(xiàn)Collection接口的類的實(shí)現(xiàn)更容易,AbstractCollection類讓一些基本方法(比如add()和iterator())變成了抽象的方法,而利用這些基本方法的其他方法(例如addAll()等等)則具體實(shí)現(xiàn)了。China It Power . ComZKWED
3. 具體的容器
3.1 ArrayList與LinkedList
都是實(shí)現(xiàn)了List接口的類,是有序集。List接口支持通過索引的方法來訪問元素,對(duì)于這一點(diǎn),ArrayList沒有任何問題;但是對(duì)于LinkedList則有很大的問題,鏈表本身不應(yīng)該支持隨機(jī)存儲(chǔ),但是作為List的一個(gè)實(shí)現(xiàn),鏈表也提供了對(duì)隨機(jī)訪問的支持,但是效率很低。每次通過索引的方法都是進(jìn)行一次遍歷。我認(rèn)為,其實(shí)就不應(yīng)該讓鏈表支持隨機(jī)訪問;而Java這樣實(shí)現(xiàn)我想是因?yàn)檎麄(gè)集合框架的體系,使得鏈表與數(shù)組可以使用同樣的方法使用。綜上所述,對(duì)于LinkedList最好不使用隨機(jī)訪問,而使用迭代器。China It Power . ComZKWED
3.2 TreeSet
3.2.1 TreeSet是SortedSet的一個(gè)實(shí)現(xiàn)。根據(jù)數(shù)據(jù)結(jié)構(gòu)的知識(shí)可以知道,樹的效率非常高,而且Java標(biāo)準(zhǔn)庫中有TreeSet這樣的類,以后應(yīng)該盡量使用TreeSet來提高程序的效率。
3.2.2 需要注意的是:TreeSet作為有序集,它通過compareTo或者Comparator來將集合元素排序。任何具有相同比較值的元素(無論它們是否equals()),在TreeSet中都作為同一個(gè)元素,從而不能有重復(fù)。這樣以來,即使是不同的對(duì)象也不能加入到集合中,這一點(diǎn)有時(shí)候很不方便。我在編寫A*算法時(shí),不同狀態(tài)有時(shí)候?qū)?yīng)著同一個(gè)啟發(fā)函數(shù)值,那么這些不同的狀態(tài)就無法加入到TreeSet中。China It Power . ComZKWED
3.3 HashSet
3.3.1 HashSet是非常高效的數(shù)據(jù)結(jié)構(gòu),與TreeSet不同,HashSet是比較對(duì)象的equals()方法來區(qū)分不同的對(duì)象。這樣只有真正不同的對(duì)象才能不被重復(fù)的加入到集合中。
3.3.2 需要注意的是:HashSet效率非常高,但是對(duì)象的hashCode函數(shù)不好確定。一般默認(rèn)的對(duì)象的hashCode函數(shù)是根據(jù)對(duì)象的內(nèi)存地址得到的。好的hashCode函數(shù)是HashSet成功運(yùn)用的關(guān)鍵。China It Power . ComZKWED
4. 視圖
4.1 什么是視圖?
對(duì)映象類使用keySet()方法,仿佛該方法建立了一個(gè)新的集合,并將影響的所有關(guān)鍵字都填入這個(gè)集合。實(shí)際情況并非如此,對(duì)這個(gè)集合的任何操作都將反映到原始的映象對(duì)象上。
實(shí)際上,keySet()返回的是一個(gè)實(shí)現(xiàn)Set接口的對(duì)象,對(duì)該對(duì)象的操作就是對(duì)映象的操作。這樣的集合成為視圖。
4.2 視圖的應(yīng)用
4.2.1 將現(xiàn)有的容器變?yōu)榫程安全的容器:使用Collections.synchronizedCollection(Collection c)方法,在SDK文檔中該方法的解釋是“Returns a synchronized (thread-safe) collection backed by the specified collection”。
4.2.2 將現(xiàn)有的容器變?yōu)橹蛔x的容器:使用Collections.unmodifiableCollection(Collection c)方法,在SDK文檔中該方法的解釋是“Returns an unmodifiable view of the specified collection.”。
4.2.3 子范圍
4.2.4 Arrays類中的asList()方法China It Power . ComZKWED
5. 通用算法
通用的集合接口帶來的一大好處就是可以編寫通用算法?梢允褂肅ollections中的靜態(tài)通用方法,也可以編寫自己的通用方法。
(具體的算法的內(nèi)容在此略去)China It Power . ComZKWED
總結(jié):千萬記住這句話——沒有最好的容器(數(shù)據(jù)結(jié)構(gòu)),要根據(jù)不同的問題選擇不同的容器,以此來達(dá)到功能的要求和效率的最優(yōu)。
【Java容器類學(xué)習(xí)心得體會(huì)】相關(guān)文章:
java學(xué)習(xí)的心得體會(huì)06-23
學(xué)習(xí)java實(shí)習(xí)心得體會(huì)06-22
學(xué)習(xí)java php就業(yè)前景06-27
java工作心得體會(huì)06-23