国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java api之實現(上)

2019-11-18 15:44:14
字體:
來源:轉載
供稿:網友

  實現

  實現是用來存儲 對象集 的實際數據對象, 它實現了在前面的章節中所描述的 核心 對象集 接口 。以下章節將描述三種實現:

  通用實現

  通用實現是公共類,它提供核心對象集接口的主要實現。

  包裝器實現

  包裝器實現與其它實現(通常為通用實現)一起提供附加功能。

  便利實現

  便利實現是小型實現,通常可通過靜態方法(static factory methods)獲得,它可方便、高效地為非凡 對象集 (象 singleton sets)替代通用實現。

  另外,根據JDK的abstract implementations,你也可以建立自己的實現。這在一個單獨的課程中有所描述,因為它屬于高級課程。它不是非凡難,但相對來講,需要它的人很少。

  通用實現

  如下表格對通用實現做了小結。該表突出顯示了它們的正常命名樣式:名稱均屬于 形式, 這里的 是由類實現的核心對象集接口, 而 表示了在該實現底層的數據結構。
         

實現

Hash Table

Resizable Array

Balanced Tree

Linked List

接口

Set

HashSet

 

TreeSet

 

List

 

ArrayList

 

LinkedList

Map

HashMap

 

TreeMap

 


  JDK 1.2 提供了每個接口的兩種實現 (Collection是個例外,它沒有直接的實現,但可當作其它 對象集 接口的最小公分母). 在每一個接口中,其中一種實現明顯的是主實現: 要使用的那個,其它東西是一樣的。主實現是 HashSet, ArrayList 和 HashMap. 注重SortedSet和SortedMap接口在上表中沒有列出。它們各自都有一個實現,這些實現(TreeSet 和 TreeMap) 被列在 Set 和 Map 欄里。
  這些實現不僅具有一致的名稱,而且還有一致的行為。它們都實現所有的包含在它們的接口中的選項操作(optional Operations),都答應 null 元素、鍵和值。每一種實現都是不同步的。

它們都具有快速失效迭代功能, 這可以在迭代過程中檢測非法并發更改,并快速徹底地失效,而不是冒在今后不可預知的時間里發生任意不可確定行為的風險。所有的實現都是可序列化的(Serializable), 并都支持公共 clone 方法。

  新實現不同步這一事實代表與過去的一個中斷:Vector 和 Hashtable 在 JDK 1.2 以前的版本中是同步的。之所以采用新的做法是因為 對象集 經常以一種同步在其中沒有益處的方式所使用。這樣的使用包括單線程使用、只讀使用以及作為一個較大的數據對象(它有它自己的同步)的一部分而使用。通常,API設計的慣例是不讓用戶為不必要的性能花錢。再者,不必要的同步在某中情況下可能會導致死鎖。

  假如你需要一個同步的 對象集, synchronization wrappers(同步包裝器)(將在 下一節介紹)答應任意 對象集 轉換為同步對象集。因此,對新的 對象集 實現來說,當它對舊的 對象集 是強制性的時候,同步是可選的。 作為一個經驗法則,你應該考慮的是接口,而不是實現。這就是為什么在這一節中沒有編程實例的原因。對大部分情況來講,實現的選擇僅影響性能。首選的風格(就象在 接口課程 中所提到的)是在創建一個 對象集 時選擇一個實現,并立即將一個新的 對象集 賦值給相應接口類型的一個變量(或將該 對象集 傳遞給參數為此接口類型的方法)。這樣,程序將不會依靠于在一個給定的實現中任意增加的方法, 并給程序員和維護人員以迅速改變實現的自由(假如有關性能答應這樣做的話)。

  下面將簡要討論通用實現。實現的性能的描述使用詞匯如 constant, log, linear, n log(n) 和 quadratic等。這些詞匯指執行操作的關于時間復雜性(time complexity)的漸進上限(asymptotic upper bound)。 所有這些可夠你消化的了,不過假如你不理解,也沒太大關系。有愛好的話可以閱讀任意一本算法教科書,那上面有關于這類內容的解釋。有一件事是應該牢記的,那就是:這種性能的度量有它的局限性。有時名義上較慢的實現對于你所實際使用大小的對象集來說可能要快。假如有些懷疑,估量一下該性能。

  Set

  兩個通用Set實現是HashSet 和TreeSet。要決定用哪一個,那是非常簡單明了的。 HashSet 要快得多 (對大多數操作是常數時間之于對數時間(constant time vs. log time)), 但不提供排序保證。假如你需要使用 SortedSet 中的操作,或者按順序迭代對你來說是重要的,那么請使用 TreeSet。 否則,使用 HashSet。 在大多數時間都不使用 HashSet ,對你來說是個公平的賭博。

  關于 HashSet,有一件事應該牢記,即就條目數和容量之和來講,迭代是線性的。因此,假如迭代性能很重要,那就應該慎重選擇一個適當的初始容量。容量選得太大,既浪費空間,也浪費時間。 默認的初試容量是101, 一般來講,它比你所需要的要多。可以使用 int 構造函數來指定初始容量。要分配 HashSet 的初始容量為17:

Set s= new HashSet(17);
  HashSets 另有一個稱作 裝載因數(load factor) 的"調整參數(tuning parameter)" 。假如你非常在乎你的 HashSet 的空間的使用,請閱讀 HashSet 文本以獲取具體信息。否則,就使用默認值吧。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 曲水县| 泊头市| 安顺市| 桦川县| 江安县| 民和| 登封市| 屏东县| 乌兰浩特市| 双城市| 安平县| SHOW| 广宁县| 通辽市| 汉川市| 叶城县| 娱乐| 汤阴县| 沈阳市| 汶上县| 密山市| 玉龙| 永平县| 上犹县| 广丰县| 龙山县| 大悟县| 泾阳县| 太仆寺旗| 日照市| 尉氏县| 遂川县| 万载县| 黎川县| 嫩江县| 永清县| 莫力| 莲花县| 屯留县| 马公市| 大城县|