您好,登錄后才能下訂單哦!
這篇文章主要介紹了Java的數據結構實例代碼分析的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Java的數據結構實例代碼分析文章都會有所收獲,下面我們一起來看看吧。
枚舉(Enumeration)接口雖然它本身不屬于數據結構,但它在其他數據結構的范疇里應用很廣。 枚舉(The Enumeration)接口定義了一種從數據結構中取回連續元素的方式。例如,枚舉定義了一個叫nextElement 的方法,該方法用來得到一個包含多元素的數據結構的下一個元素。
這種傳統接口已被 Iterator (迭代器)取代,雖然Enumeration 還未被遺棄,但在現代代碼中已經被很少使用了。盡管如此,它還是使用在諸如Vector(向量)和Properties(屬性)這些傳統類所定義的方法中,除此之外,還用在一些API類,并且在應用程序中也廣泛被使用。 下表總結了一些Enumeration聲明的方法:
序號 | 方法及說明 |
---|---|
1 | boolean hasMoreElements( ) ,測試此枚舉是否包含更多的元素 |
2 | Object nextElement( ) ,如果此枚舉對象至少還有一個可提供的元素,則返回此枚舉的下一個元素 |
位集合類實現了一組可以單獨設置和清除的位或標志。該類在處理一組布爾值的時候非常有用,你只需要給每個值賦值一"位",然后對位進行適當的設置或清除,就可以對布爾值進行操作了。
一個Bitset類創建一種特殊類型的數組來保存位值。BitSet中數組大小會隨需要增加。這和位向量(vector of bits)比較類似。這是一個傳統的類,但它在Java 2中被完全重新設計。
BitSet定義了兩個構造方法:
// 第一個構造方法創建一個默認的對象: public BitSet() // 第二個方法允許用戶指定初始大小。所有位初始化為0 public BitSet(int nbits)
BitSet中實現了Cloneable接口中定義的方法如下表所列:
序號 | 方法及說明 |
---|---|
1 | void and(BitSet set) ,對此目標位 set 和參數位 set 執行邏輯與操作 |
2 | void andNot(BitSet set) ,清除此 BitSet 中所有的位,其相應的位在指定的 BitSet 中已設置 |
3 | int cardinality( ) ,返回此 BitSet 中設置為 true 的位數 |
4 | void clear( ) ,將此 BitSet 中的所有位設置為 false |
5 | void clear(int index) ,將索引指定處的位設置為 false |
6 | void clear(int startIndex, int endIndex) ,將指定的 startIndex(包括)到指定的 toIndex(不包括)范圍內的位設置為 false |
7 | Object clone( ) ,復制此 BitSet,生成一個與之相等的新 BitSet |
8 | boolean equals(Object bitSet) ,將此對象與指定的對象進行比較 |
9 | void flip(int index) ,將指定索引處的位設置為其當前值的補碼 |
10 | void flip(int startIndex, int endIndex) ,將指定的 fromIndex(包括)到指定的 toIndex(不包括)范圍內的每個位設置為其當前值的補碼 |
11 | boolean get(int index) ,返回指定索引處的位值 |
12 | BitSet get(int startIndex, int endIndex) ,返回一個新的 BitSet,它由此 BitSet 中從 fromIndex(包括)到 toIndex(不包括)范圍內的位組成 |
13 | int hashCode( ) ,返回此位 set 的哈希碼值 |
14 | boolean intersects(BitSet bitSet) ,如果指定的 BitSet 中有設置為 true 的位,并且在此 BitSet 中也將其設置為 true,則返回 true |
15 | boolean isEmpty( ) ,如果此 BitSet 中沒有包含任何設置為 true 的位,則返回 true |
16 | int length( ) ,返回此 BitSet 的"邏輯大小":BitSet 中最高設置位的索引加 1 |
17 | int nextClearBit(int startIndex) ,返回第一個設置為 false 的位的索引,這發生在指定的起始索引或之后的索引上 |
18 | int nextSetBit(int startIndex),返回第一個設置為 true 的位的索引,這發生在指定的起始索引或之后的索引上 |
19 | void or(BitSet bitSet),對此位 set 和位 set 參數執行邏輯或操作 |
20 | void set(int index),將指定索引處的位設置為 true |
21 | void set(int index, boolean v),將指定索引處的位設置為指定的值 |
22 | void set(int startIndex, int endIndex),將指定的 fromIndex(包括)到指定的 toIndex(不包括)范圍內的位設置為 true |
23 | void set(int startIndex, int endIndex, boolean v),將指定的 fromIndex(包括)到指定的 toIndex(不包括)范圍內的位設置為指定的值 |
24 | int size( ),返回此 BitSet 表示位值時實際使用空間的位數 |
25 | String toString( ),返回此位 set 的字符串表示形式 |
26 | void xor(BitSet bitSet),對此位 set 和位 set 參數執行邏輯異或操作 |
實例:
public class Test { public static void main(String args[]) throws IOException { BitSet bits1 = new BitSet(16); BitSet bits2 = new BitSet(16); // 設置一些位 for(int i=0; i<16; i++) { if((i%2) == 0) bits1.set(i); if((i%5) != 0) bits2.set(i); } System.out.println("位集合1初始模式: "); System.out.println(bits1); System.out.println("\n位集合2初始模式: "); System.out.println(bits2); // 對此目標位 set 和參數位 set 執行邏輯與操作 bits2.and(bits1); System.out.println("\n位集合2 與 位集合1 執行邏輯與操作 "); System.out.println(bits2); // 對此位 set 和位 set 參數執行邏輯或操作 bits2.or(bits1); System.out.println("\n位集合2 與 位集合1 執行邏輯或操作: "); System.out.println(bits2); // 對此位 set 和位 set 參數執行邏輯異或操作 bits2.xor(bits1); System.out.println("\n位集合2 與 位集合1 執行邏輯異或操作 "); System.out.println(bits2); } } // 程序編譯運行結果如下: // 位集合1初始模式: // {0, 2, 4, 6, 8, 10, 12, 14} // 位集合2初始模式: // {1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14} // 位集合2 與 位集合1 執行邏輯與操作 // {2, 4, 6, 8, 12, 14} // 位集合2 與 位集合1 執行邏輯或操作: // {0, 2, 4, 6, 8, 10, 12, 14} // 位集合2 與 位集合1 執行邏輯異或操作 // {}
向量(Vector)類和傳統數組非常相似,但是Vector的大小能根據需要動態的變化。和數組一樣,Vector對象的元素也能通過索引訪問。使用Vector類最主要的好處就是在創建對象的時候不必給對象指定大小,它的大小會根據需要動態的變化。
Vector 與 ArrayList的區別:
Vector 是同步訪問的,所以線程就會安全,但是同時也會帶來弊端就是效率就會降低,但 Arraylist 恰恰相反,這也就導致Arraylist的效率比 Vector 高。
在進行擴容時,Vector 會增長為原來數組長的一倍,而 Arraylist 只會增長為原來的一半,所以Arraylist節約內存空間。
Vector 包含了許多傳統的方法,這些方法不屬于集合框架。
Vector 類支持 4 種構造方法:
// 第一種構造方法創建一個默認的向量,默認大小為 10 Vector() // 第二種構造方法創建指定大小的向量 Vector(int size) // 第三種構造方法創建指定大小的向量,并且增量用 incr 指定。增量表示向量每次增加的元素數目 Vector(int size,int incr) // 第四種構造方法創建一個包含集合 c 元素的向量 Vector(Collection c)
除了從父類繼承的方法外 Vector 還定義了以下方法:
序號 | 方法及說明 |
---|---|
1 | void add(int index, Object element) ,在此向量的指定位置插入指定的元素 |
2 | boolean add(Object o) ,將指定元素添加到此向量的末尾 |
3 | boolean addAll(Collection c) ,將指定 Collection 中的所有元素添加到此向量的末尾,按照指定 collection 的迭代器所返回的順序添加這些元素 |
4 | boolean addAll(int index, Collection c) ,在指定位置將指定 Collection 中的所有元素插入到此向量中 |
5 | void addElement(Object obj) ,將指定的組件添加到此向量的末尾,將其大小增加 1 |
6 | int capacity() ,返回此向量的當前容量 |
7 | void clear() ,從此向量中移除所有元素 |
8 | Object clone() ,返回向量的一個副本 |
9 | boolean contains(Object elem) ,如果此向量包含指定的元素,則返回 true |
10 | boolean containsAll(Collection c) ,如果此向量包含指定 Collection 中的所有元素,則返回 true |
11 | void copyInto(Object[] anArray) ,將此向量的組件復制到指定的數組中 |
12 | Object elementAt(int index) ,返回指定索引處的組件 |
13 | Enumeration elements() ,返回此向量的組件的枚舉 |
14 | void ensureCapacity(int minCapacity) ,增加此向量的容量(如有必要),以確保其至少能夠保存最小容量參數指定的組件數 |
15 | boolean equals(Object o) ,比較指定對象與此向量的相等性 |
16 | Object firstElement() ,返回此向量的第一個組件(位于索引 0) 處的項) |
17 | Object get(int index) ,返回向量中指定位置的元素 |
18 | int hashCode() ,返回此向量的哈希碼值 |
19 | int indexOf(Object elem) ,返回此向量中第一次出現的指定元素的索引,如果此向量不包含該元素,則返回 -1 |
20 | int indexOf(Object elem, int index) ,返回此向量中第一次出現的指定元素的索引,從 index 處正向搜索,如果未找到該元素,則返回 -1 |
21 | void insertElementAt(Object obj, int index) ,將指定對象作為此向量中的組件插入到指定的 index 處 |
22 | boolean isEmpty() ,測試此向量是否不包含組件 |
23 | Object lastElement() ,返回此向量的最后一個組件 |
24 | int lastIndexOf(Object elem) ,返回此向量中最后一次出現的指定元素的索引;如果此向量不包含該元素,則返回 -1 |
25 | int lastIndexOf(Object elem, int index) ,返回此向量中最后一次出現的指定元素的索引,從 index 處逆向搜索,如果未找到該元素,則返回 -1 |
26 | Object remove(int index) ,移除此向量中指定位置的元素 |
27 | boolean remove(Object o) ,移除此向量中指定元素的第一個匹配項,如果向量不包含該元素,則元素保持不變 |
28 | boolean removeAll(Collection c) ,從此向量中移除包含在指定 Collection 中的所有元素 |
29 | void removeAllElements(),從此向量中移除全部組件,并將其大小設置為零 |
30 | boolean removeElement(Object obj) ,從此向量中移除變量的第一個(索引最小的)匹配項 |
31 | void removeElementAt(int index) ,刪除指定索引處的組件 |
32 | protected void removeRange(int fromIndex, int toIndex) ,從此向量中移除其索引位于 fromIndex(包括)與 toIndex(不包括)之間的所有元素 |
33 | boolean retainAll(Collection c) ,在此向量中僅保留包含在指定 Collection 中的元素 |
34 | Object set(int index, Object element) ,用指定的元素替換此向量中指定位置處的元素 |
35 | void setElementAt(Object obj, int index) ,將此向量指定 index 處的組件設置為指定的對象 |
36 | void setSize(int newSize) ,設置此向量的大小 |
37 | int size() ,返回此向量中的組件數 |
38 | List subList(int fromIndex, int toIndex) ,返回此 List 的部分視圖,元素范圍為從 fromIndex(包括)到 toIndex(不包括) |
39 | Object[] toArray() ,返回一個數組,包含此向量中以恰當順序存放的所有元素 |
40 | Object[] toArray(Object[] a) ,返回一個數組,包含此向量中以恰當順序存放的所有元素;返回數組的運行時類型為指定數組的類型 |
41 | String toString() ,返回此向量的字符串表示形式,其中包含每個元素的 String 表示形式 |
42 | void trimToSize() ,對此向量的容量進行微調,使其等于向量的當前大小 |
實例:
public class Test { public static void main(String args[]) throws IOException { // 初始大小為3,增量為2 Vector v = new Vector(3, 2); System.out.println("初始大小: " + v.size()); System.out.println("初始容量: " + v.capacity()); v.addElement(new Integer(1)); v.addElement(new Double(5.45)); v.addElement(new Double(6.08)); v.addElement(new Integer(7)); System.out.println("四次添加后的容量: " + v.capacity()); v.addElement(new Float(9.4)); System.out.println("當前容量: " + v.capacity()); v.addElement(new Integer(10)); System.out.println("當前容量: " + v.capacity()); System.out.println("第一元素: " + (Integer)v.firstElement()); System.out.println("最后一個元素: " + (Integer)v.lastElement()); v.addElement(new Integer(3)); // 向量包含3 if(v.contains(new Integer(3))) { System.out.println("向量包含 3"); } // 列舉向量中的元素 Enumeration vEnum = v.elements(); System.out.println("\n向量中的元素:"); while(vEnum.hasMoreElements()) { System.out.print(vEnum.nextElement() + " "); } System.out.println(); } } // 程序編譯運行結果如下: // 初始大小: 0 // 初始容量: 3 // 四次添加后的容量: 5 // 當前容量: 5 // 當前容量: 7 // 第一元素: 1 // 最后一個元素: 10 // 向量包含 3 // 向量中的元素: // 1 5.45 6.08 7 9.4 10 3
棧(Stack)實現了一個后進先出(LIFO)的數據結構。你可以把棧理解為對象的垂直分布的棧,當你添加一個新元素時,就將新元素放在其他元素的頂部。當你從棧中取元素的時候,就從棧頂取一個元素。換句話說,最后進棧的元素最先被取出。
棧是Vector的一個子類,棧只定義了默認構造函數,用來創建一個空棧。棧除了包括由Vector定義的所有方法,也定義了自己的一些方法:
序號 | 方法及說明 |
---|---|
1 | boolean empty() ,測試棧是否為空 |
2 | Object peek( ) ,查看棧頂部的對象,但不從棧中移除它 |
3 | Object pop( ) ,移除棧頂部的對象,并作為此函數的值返回該對象 |
4 | Object push(Object element) ,把項壓入堆棧頂部 |
5 | int search(Object element) ,返回對象在堆棧中的位置,以 1 為基數 |
字典(Dictionary) 類是一個抽象類,它定義了鍵映射到值的數據結構。當你想要通過特定的鍵而不是整數索引來訪問數據的時候,這時候應該使用Dictionary。由于Dictionary類是抽象類,所以它只提供了鍵映射到值的數據結構,而沒有提供特定的實現。
Dictionary類已經過時了。在實際開發中,你可以實現 Map 接口來獲取鍵/值的存儲功能。
Hashtable類提供了一種在用戶定義鍵結構的基礎上來組織數據的手段。例如,在地址列表的哈希表中,你可以根據郵政編碼作為鍵來存儲和排序數據,而不是通過人名。哈希表鍵的具體含義完全取決于哈希表的使用情景和它包含的數據。
Hashtable是原始的java.util的一部分, 是一個Dictionary具體的實現 。然而,Java 2 重構的Hashtable實現了 Map 接口,因此,Hashtable 現在集成到了集合框架中。它和HashMap類很相似,但是它支持同步。
像HashMap一樣,Hashtable在哈希表中存儲鍵/值對。當使用一個哈希表,要指定用作鍵的對象,以及要鏈接到該鍵的值。然后,該鍵經過哈希處理,所得到的散列碼被用作存儲在該表中值的索引。
Hashtable定義了四個構造方法:
// 默認構造方法 public Hashtable() // 創建指定大小的哈希表 public Hashtable(int initialCapacity) // 創建了一個指定大小的哈希表,并且通過fillRatio指定填充比例 // 填充比例必須介于0.0和1.0之間,它決定了哈希表在重新調整大小之前的充滿程度 public Hashtable(int initialCapacity, float loadFactor) // 創建了一個以 t 中元素為初始化元素的哈希表,哈希表的容量被設置為 t 的兩倍 public Hashtable(Map<? extends K, ? extends V> t)
Hashtable中除了從Map接口中定義的方法外,還定義了以下方法:
序號 | 方法及說明 |
---|---|
1 | void clear( ) ,將此哈希表清空,使其不包含任何鍵 |
2 | Object clone( ) ,創建此哈希表的淺表副本 |
3 | boolean contains(Object value) ,測試此映射表中是否存在與指定值關聯的鍵 |
4 | boolean containsKey(Object key) ,測試指定對象是否為此哈希表中的鍵 |
5 | boolean containsValue(Object value) ,如果此 Hashtable 將一個或多個鍵映射到此值,則返回 true |
6 | Enumeration elements( ) ,返回此哈希表中的值的枚舉 |
7 | Object get(Object key) ,返回指定鍵所映射到的值,如果此映射不包含此鍵的映射,則返回 null. 更確切地講,如果此映射包含滿足 (key.equals(k)) 的從鍵 k 到值 v 的映射,則此方法返回 v;否則,返回 null |
8 | boolean isEmpty( ) ,測試此哈希表是否沒有鍵映射到值 |
9 | Enumeration keys( ) ,返回此哈希表中的鍵的枚舉 |
10 | Object put(Object key, Object value) ,將指定 key 映射到此哈希表中的指定 value |
11 | void rehash( ) ,增加此哈希表的容量并在內部對其進行重組,以便更有效地容納和訪問其元素 |
12 | Object remove(Object key) ,從哈希表中移除該鍵及其相應的值 |
13 | int size( ) ,返回此哈希表中的鍵的數量 |
14 | String toString( ) ,返回此 Hashtable 對象的字符串表示形式,其形式為 ASCII 字符 ", " (逗號加空格)分隔開的、括在括號中的一組條目 |
Properties 繼承于 Hashtable。Properties 類表示了一個持久的屬性集。屬性列表中每個鍵及其對應值都是一個字符串。Properties 類被許多Java類使用。例如,在獲取環境變量時它就作為System.getProperties()方法的返回值。
Properties 定義如下實例變量.這個變量持有一個 Properties 對象相關的默認屬性列表:
protected Properties defaults;
Properties類定義了兩個構造方法:
// 第一個構造方法沒有默認值 public Properties() // 第二個構造方法使用propDefault 作為默認值 public Properties(Properties defaults)
除了從 Hashtable 中所定義的方法,Properties 還定義了以下方法:
序號 | 方法及說明 |
---|---|
1 | String getProperty(String key), 用指定的鍵在此屬性列表中搜索屬性 |
2 | String getProperty(String key, String defaultProperty),用指定的鍵在屬性列表中搜索屬性 |
3 | void list(PrintStream streamOut),將屬性列表輸出到指定的輸出流 |
4 | void list(PrintWriter streamOut),將屬性列表輸出到指定的輸出流 |
5 | void load(InputStream streamIn) throws IOException,從輸入流中讀取屬性列表(鍵和元素對) |
6 | Enumeration propertyNames( ),按簡單的面向行的格式從輸入字符流中讀取屬性列表(鍵和元素對) |
7 | Object setProperty(String key, String value),調用 Hashtable 的方法 put |
8 | void store(OutputStream streamOut, String description),以適合使用 load(InputStream)方法加載到 Properties 表中的格式,將此 Properties 表中的屬性列表(鍵和元素對)寫入輸出流 |
關于“Java的數據結構實例代碼分析”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Java的數據結構實例代碼分析”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。