Hashtable和HashMap
Hashtable和HashMap類有三個重要的不同之處。第一個不同主要是曆史原因。Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map介面的一個實現。
也許最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。這就意味著,雖然你可以不用採取任何特殊的行為就可以在一個多線程的應用程式中用一個Hashtable,但你必須同樣地為一個HashMap提供外同步。一個方便的方法就是利用Collections類的靜態synchronizedMap()方法,它建立一個安全執行緒的Map對象,並把它作為一個封裝的對象來返回。這個對象的方法可以讓你同步訪問潛在的HashMap。這麼做的結果就是當你不需要同步時,你不能切斷Hashtable中的同步(比如在一個單線程的應用程式中),而且同步增加了很多處理費用。
第三點不同是,只有HashMap可以讓你將空值作為一個表的條目的key或value。HashMap中只有一條記錄可以是一個空的key,但任意數量的條目可以是空的value。這就是說,如果在表中沒有發現搜尋鍵,或者如果發現了搜尋鍵,但它是一個空的值,那麼get()將返回null。如果有必要,用containKey()方法來區別這兩種情況。
一些資料建議,當需要同步時,用Hashtable,反之用HashMap。但是,因為在需要時,HashMap可以被同步,HashMap的功能比Hashtable的功能更多,而且它不是基於一個陳舊的類的,所以有人認為,在各種情況下,HashMap都優先於Hashtable。
---
XML 的編程介面: DOM SAX JDOM JAXP
文件物件模型(通常稱為 DOM)為 XML 文檔的已解析版本定義了一組介面。解析器讀入整個文檔,然後構建一個駐留記憶體的樹結構,然後您的代碼就可以使用 DOM 介面來操作這個樹結構。您可以遍曆樹以瞭解原始文檔包含了什麼,您可以刪除樹的幾個部分,還可以重新排列樹和添加新的分支
DOM 提供了一組豐富的功能,您可以用這些功能來解釋和操作 XML 文檔,但使用它們是有代價的。
DOM 構建整個文檔駐留記憶體的樹。如果文檔很大,就會要求有極大的記憶體。
DOM 建立表示原始文檔中每個東西的對象,包括元素、文本、屬性和空格。如果您只需關注原始文檔的一小部分,那麼建立那些永遠不被使用的對象是極其浪費的。
DOM 解析器必須在您的代碼取得控制權之前讀取整個文檔。對於非常大的文檔,這會引起顯著的延遲
為瞭解決 DOM 問題,XML-DEV 參與者們(由 David Megginson 領導)建立了 SAX 介面。SAX 的幾個特徵解決了 DOM 的問題:
SAX 事件是無狀態的。當 SAX 解析器在 XML 文檔中發現文本時,它就向您的代碼發送一個事件。該事件僅僅給您發現的文本;它不告訴您什麼元素包含那個文本。如果您想知道這一點,則必須自己編寫狀態管理代碼。
SAX 事件不是持久的。如果應用程式需要一個資料結構來對 XML 文檔建模,則必須自己編寫那樣的代碼。如果您需要從 SAX 事件訪問資料,並且沒有把那個資料存放區在代碼中,那麼您不得不再次解析該文檔。
JDOM 是基於 Java 技術的開放源碼項目,它試圖遵循 80/20 規則:用 DOM 和 SAX 20% 的功能來滿足 80% 的使用者需求。JDOM 使用 SAX 和 DOM 解析器,因此它是作為一組相對較小的 Java 類被實現的。
JDOM 的主要特性是它極大地減少了您必須編寫的代碼數量。儘管本篇介紹性教程並不深入討論編程主題,但 JDOM 應用程式的長度通常是 DOM 應用程式的三分之一,大約是 SAX 應用程式的一半。(當然,堅持使用 DOM 的純粹主義者會建議說:從長遠來看,學習和使用 DOM 終會有所回報)。JDOM 並不做所有的事,但對於大多數您要做的解析,它可能正好適合您。
儘管 DOM、SAX 和 JDOM 為大多數常見任務提供了標準介面,但仍有些事情是它們不能解決的。例如,在 Java 程式中建立 DOMParser 對象的過程因 DOM 解析器的不同而不同。為了修正這個問題,Sun 發布了 JAXP(用於 XML 解析的 Java API,Java API for XML Parsing)。該 API 為使用 DOM、SAX 和 XSLT 處理 XML 文檔提供了公用介面。
JAXP 提供的諸如 DocumentBuilderFactory 和 DocumentBuilder 之類的介面為不同的解析器提供了一個標準介面。還有一些方法可以允許您控制底層的解析器是否可以識別名稱空間以及是否使用 DTD 或模式來驗證 XML 文檔。
為了確定哪種介面適合您,您需要理解所有介面的設計要點,而且需要理解應用程式用您將要處理的 XML 文檔來做什麼。考慮下面的問題將有助於您找到正確的方法。
要用 Java 編寫應用程式嗎?JAXP 使用 DOM、SAX 和 JDOM;如果您用 Java 編寫代碼,那麼您應使用 JAXP 將您的代碼與各種解析器實現的細節隔離。
應用程式將如何部署?如果您的應用程式將要作為 Java applet 部署,那麼您會希望使要下載的代碼數量最小,別忘了 SAX 解析器比 DOM 解析器小。還要知道使用 JDOM 時,除了 SAX 或 DOM 解析器之外還要求編寫少量的代碼。
一旦解析了 XML 文檔,還需要多次訪問那些資料嗎?如果您需要回過頭來訪問 XML 檔案的已解析版本,DOM 可能是正確的選擇。而 SAX 事件被觸發時,如果您以後需要它,則由您(開發人員)自己決定以某種方式儲存它。如果您需要訪問不曾儲存的事件,則必須再次解析該檔案。而 DOM 自動儲存所有的資料。
只需要 XML 摘要檔案的少量內容嗎?如果您只需要 XML 摘要檔案的少量內容,那麼 SAX 可能是正確的選擇。SAX 不會為源檔案中的每個東西建立對象;您要確定什麼是重要的。使用 SAX,您要檢查每個事件以瞭解它是否與您的需要有關,然後相應地處理它。更妙的是,一旦找到您正在尋找的東西,您的代碼就會拋出一個異常來完全停止 SAX 解析器。
您正在一台記憶體很少的機器上工作嗎?若是的話,不管您可能考慮到的其它因素是什麼,SAX 是您的最佳選擇。