一起學 Java(三) 集合框架、數據結構、泛型

来源:http://www.cnblogs.com/suoning/archive/2017/01/03/6234907.html
-Advertisement-
Play Games

一、Java 集合框架 集合框架是一個用來代表和操縱集合的統一架構。所有的集合框架都包含如下內容: 介面:是代表集合的抽象數據類型。介面允許集合獨立操縱其代表的細節。在面向對象的語言,介面通常形成一個層次。 實現(類):是集合介面的具體實現。從本質上講,它們是可重覆使用的數據結構。 演算法:是實現集合 ...


一、Java 集合框架

集合框架是一個用來代表和操縱集合的統一架構。所有的集合框架都包含如下內容:

  • 介面:是代表集合的抽象數據類型。介面允許集合獨立操縱其代表的細節。在面向對象的語言,介面通常形成一個層次。
  • 實現(類):是集合介面的具體實現。從本質上講,它們是可重覆使用的數據結構。
  • 演算法:是實現集合介面的對象里的方法執行的一些有用的計算,例如:搜索和排序。這些演算法被稱為多態,那是因為相同的方法可以在相似的介面上有著不同的實現。

 

集合介面

序號name介面描述
1 Collection

Collection 是最基本的集合介面,一個 Collection 代表一組 Object,Java不提供直接繼承自Collection的類,只提供繼承於的子介面(如List和set)。

2 List

List介面是一個有序的Collection,使用此介面能夠精確的控制每個元素插入的位置,能夠通過索引(元素在List中位置,類似於數組的小標)來訪問List中的元素,而且允許有相同的元素。

3 Set

Set 具有與 Collection 完全一樣的介面,只是行為上不同,Set 不保存重覆的元素。

4 SortedSet 繼承於Set保存有序的集合。
5 Map 將唯一的鍵映射到值。
6 Map.Entry 描述在一個Map中的一個元素(鍵/值對)。是一個Map的內部類。
7 SortedMap 繼承於Map,使Key保持在升序排列。
8 Enumeration 這是一個傳統的介面和定義的方法,通過它可以枚舉(一次獲得一個)對象集合中的元素。這個傳統介面已被迭代器取代。

 

集合實現類(集合類)

Java提供了一套實現了Collection介面的標準集合類。其中一些是具體類,這些類可以直接拿來使用,而另外一些是抽象類,提供了介面的部分實現。

標準集合類彙總於下表:

序號name 類描述
1  AbstractCollection  實現了大部分的集合介面。
2  AbstractList  繼承於AbstractCollection 並且實現了大部分List介面。
3  AbstractSequentialList  繼承於 AbstractList ,提供了對數據元素的鏈式訪問而不是隨機訪問。
4  LinkedList

該類實現了List介面,允許有null(空)元素。主要用於創建鏈表數據結構,該類沒有同步方法,如果多個線程同時訪問一個List,則必須自己實現訪問同步,解決方法就是在創建List時候構造一個同步的List。例如:

Listlist=Collections.synchronizedList(newLinkedList(...));

LinkedList 查找效率低。

5  ArrayList

該類也是實現了List的介面,實現了可變大小的數組,隨機訪問和遍歷元素時,提供更好的性能。該類也是非同步的,在多線程的情況下不要使用。ArrayList 增長當前長度的50%,插入刪除效率低。

6  AbstractSet  繼承於AbstractCollection 並且實現了大部分Set介面。
7  HashSet

該類實現了Set介面,不允許出現重覆元素,不保證集合中元素的順序,允許包含值為null的元素,但最多只能一個。

8  LinkedHashSet 具有可預知迭代順序的 Set 介面的哈希表和鏈接列表實現。
9  TreeSet

該類實現了Set介面,可以實現排序等功能。

10  AbstractMap  實現了大部分的Map介面。
11  HashMap HashMap 是一個散列表,它存儲的內容是鍵值對(key-value)映射。
該類實現了Map介面,根據鍵的HashCode值存儲數據,具有很快的訪問速度,最多允許一條記錄的鍵為null,不支持線程同步。
12  TreeMap 繼承了AbstractMap,並且使用一顆樹。
13  WeakHashMap  繼承AbstractMap類,使用弱密鑰的哈希表。
14  LinkedHashMap 繼承於HashMap,使用元素的自然順序對元素進行排序.
15  IdentityHashMap  繼承AbstractMap類,比較文檔時使用引用相等。

 

在前面的教程中已經討論通過java.util包中定義的類,如下所示:

序號 name類描述
1  Vector 

該類和ArrayList非常相似,但是該類是同步的,可以用在多線程的情況,該類允許設置預設的增長長度,預設擴容方式為原來的2倍。

2  Stack  棧是Vector的一個子類,它實現了一個標準的後進先出的棧。
3  Dictionary  Dictionary 類是一個抽象類,用來存儲鍵/值對,作用和Map類相似。
4  Hashtable Hashtable 是 Dictionary(字典) 類的子類,位於 java.util 包中。
5  Properties  Properties 繼承於 Hashtable,表示一個持久的屬性集,屬性列表中每個鍵及其對應值都是一個字元串。
6  BitSet 一個Bitset類創建一種特殊類型的數組來保存位值。BitSet中數組大小會隨需要增加。

 

import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;

public class myArrayList {
    public static void main(String[] args){
        List<String> list = new ArrayList<String>();
        list.add("nick");
        list.add("jenny");
        list.add("Maria");
        
        //第一種遍歷方法使用foreach遍歷List
        for (String str : list){
            System.out.println(str);
        }
        
        //第二種遍歷,把鏈表變為數組相關的內容進行遍歷
        String[] strArray = new String[list.size()];
        list.toArray(strArray);
        for (int i=0;i<strArray.length;i++){
            System.out.println(strArray[i]);
        }
        
        //第三種遍歷 使用迭代器進行相關遍歷
        Iterator<String> ite=list.iterator();
        while (ite.hasNext()){
            System.out.println(ite.next());
        }
    }
}
myArrayList.java
package three;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class mymap {
    public static void main(String[] args){
        Map<String, String> map = new HashMap<String, String>();
        map.put("name", "nick");
        map.put("age", "18");
        map.put("single", "singleDog");
        
        //第一種:普遍使用,二次取值
        for (String key : map.keySet()){
            System.out.println(key + " " + map.get(key));
        }
        
        //通過Map.entrySet使用iterator遍歷key和value
        Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, String> entry = it.next();
            System.out.println(entry.getKey() + " " + entry.getValue());
        }
        
        //第三種:推薦,尤其是容量大時
        for (Map.Entry<String, String> entry : map.entrySet()){
            System.out.println(entry.getKey() + " " + entry.getValue());
        }
        
        //通過Map.values()遍歷所有的value,但不能遍歷key
        for (String v : map.values()){
            System.out.println(v);
        }
    }
}
mymap.java

 

二、Java數據結構

在Java中的數據結構主要包括以下幾種介面和類:

  • 枚舉(Enumeration)
  • 位集合(BitSet)
  • 向量(Vector)
  • 棧(Stack)
  • 字典(Dictionary)
  • 哈希表(Hashtable)
  • 屬性(Properties)

 

枚舉(Enumeration)

Enumeration介面中定義了一些方法,通過這些方法可以枚舉(一次獲得一個)對象集合中的元素。

這種傳統介面已被迭代器取代,雖然Enumeration 還未被遺棄,但在現代代碼中已經被很少使用了。儘管如此,它還是使用在諸如Vector和Properties這些傳統類所定義的方法中,除此之外,還用在一些API類,並且在應用程式中也廣泛被使用。 下表總結了一些Enumeration聲明的方法:

序號方法描述
1 boolean hasMoreElements( )
 測試此枚舉是否包含更多的元素。
2 Object nextElement( )
如果此枚舉對象至少還有一個可提供的元素,則返回此枚舉的下一個元素。

 

package three;

import java.util.Vector;
import java.util.Enumeration;

public class myEnumeration {
    public static void main(String[] args){
        Enumeration days;
        Vector dayNames = new Vector();
        dayNames.add("Sunday");
        dayNames.add("Monday");
        dayNames.add("Tuesday");
        dayNames.add("Wednesday");
        dayNames.add("Thursday");
        dayNames.add("Friday");
        dayNames.add("Saturday");
        days = dayNames.elements();
        while (days.hasMoreElements()){
           System.out.println(days.nextElement()); 
        }
    }
}
practice

 

位集合(BitSet)

位集合類實現了一組可以單獨設置和清除的位或標誌。

該類在處理一組布爾值的時候非常有用,你只需要給每個值賦值一"位",然後對位進行適當的設置或清除,就可以對布爾值進行操作了。

一個Bitset類創建一種特殊類型的數組來保存位值。BitSet中數組大小會隨需要增加。這和位向量(vector of bits)比較類似。

這是一個傳統的類,但它在Java 2中被完全重新設計。

BitSet定義了兩個構造方法。

BitSet()    //第一個構造方法創建一個預設的對象
BitSet(int size)    //第二個方法允許用戶指定初始大小。所有位初始化為0。

BitSet中實現了Cloneable介面中定義的方法如下表所列:

 

序號方法描述
1 void and(BitSet bitSet)
對此目標位 set 和參數位 set 執行邏輯與操作。
2 void andNot(BitSet bitSet)
清除此 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)
將指定的 fromIndex(包括)到指定的 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,則返回 ture。
15 boolean isEmpty( )
如果此 BitSet 中沒有包含任何設置為 true 的位,則返回 ture。
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 參數執行邏輯異或操作。

 

package three;


import java.util.BitSet;

public class myBitset {
    public static void main(String[] args){
        BitSet bits1 = new BitSet(16);
        BitSet bits2 = new BitSet(16);
        
        // set some bits
        for(int i=0; i<16; i++) {
            if((i%2) == 0) bits1.set(i);
            if((i%5) != 0) bits2.set(i);
        }
        System.out.println("Initial pattern in bits1: ");
        System.out.println(bits1);    // {0, 2, 4, 6, 8, 10, 12, 14}
        System.out.println("\nInitial pattern in bits2: ");
        System.out.println(bits2);    // {1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14}
        
        // AND bits
        bits2.and(bits1);
        System.out.println("\nbits2 AND bits1: ");
        System.out.println(bits1);    // {0, 2, 4, 6, 8, 10, 12, 14}
        System.out.println(bits2);    // {2, 4, 6, 8, 12, 14}
        
        // OR bits
        bits2.or(bits1);
        System.out.println("\nbits2 OR bits1: ");
        System.out.println(bits1);    // {0, 2, 4, 6, 8, 10, 12, 14}
        System.out.println(bits2);    // {0, 2, 4, 6, 8, 10, 12, 14}
        
        // XOR bits
        bits2.xor(bits1);
        System.out.println("\nbits2 XOR bits1: ");
        System.out.println(bits1);    // {0, 2, 4, 6, 8, 10, 12, 14}
        System.out.println(bits2);    // {}
    }
}
practice

 

向量(Vector)

向量(Vector)類和傳統數組非常相似,但是Vector的大小能根據需要動態的變化。

和數組一樣,Vector對象的元素也能通過索引訪問。

使用Vector類最主要的好處就是在創建對象的時候不必給對象指定大小,它的大小會根據需要動態的變化。

Vector類實現了一個動態數組。和ArrayList和相似,但是兩者是不同的:

  • Vector是同步訪問的。
  • Vector包含了許多傳統的方法,這些方法不屬於集合框架。

Vector主要用在事先不知道數組的大小,或者只是需要一個可以改變大小的數組的情況。

Vector類支持4種構造方法。

Vector()    //第一種構造方法創建一個預設的向量,預設大小為10
Vector(int size)    //第二種構造方法創建指定大小的向量
Vector(int size,int incr)    //第三種構造方法創建指定大小的向量,並且增量用incr指定. 增量表示向量每次增加的元素數目
Vector(Collection c)    //第四中構造方法創建一個包含集合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)
從此 List 中移除其索引位於 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() 
  對此向量的容量進行微調,使其等於向量的當前大小。

 

package three;


import java.util.*;

public class myVector {
    public static void main(String[] args){
          Vector v = new Vector(3, 2);
          System.out.println(v.size());    // 0
          System.out.println(v.capacity());    // 3
          v.addElement(new Integer(1));
          System.out.println(v.capacity());    // 3
          v.addElement(new Integer(2));
          System.out.println(v.capacity());    // 3
          v.addElement(new Integer(3));
          System.out.println(v.capacity());    // 3
          
          v.addElement(new Integer(4));
          System.out.println(v.capacity());    // 5
          v.addElement(new Double(5.45));
          System.out.println(v.capacity());    // 5
          
          v.addElement(new Double(6.08));
          v.addElement(new Integer(7));
          System.out.println(v.capacity());    // 7
          v.addElement(new Float(9.4));
          v.addElement(new Integer(10));
          System.out.println(v.capacity());    // 9
          v.addElement(new Integer(11));
          v.addElement(new Integer(12));
          System.out.println(v.capacity());    // 11
          System.out.println((Integer)v.firstElement()); // 1
          System.out.println((Integer)v.lastElement());    // 12
          
          if(v.contains(new Integer(3)))
             System.out.println("Vector contains 3.");    //true
          
          // enumerate the elements in the vector.
          Enumeration vEnum = v.elements();
          System.out.println("\nElements in vector:");
          while(vEnum.hasMoreElements())
             System.out.print(vEnum.nextElement() + " ");
               // 1 2 3 4 5.45 6.08 7 9.4 10 11 12 
          System.out.println();
    }
}
practice

 

棧(Stack)

棧(Stack)實現了一個後進先出(LIFO)的數據結構。

你可以把棧理解為對象的垂直分佈的棧,當你添加一個新元素時,就將新元素放在其他元素的頂部。

當你從棧中取元素的時候,就從棧頂取一個元素。換句話說,最後進棧的元素最先被取出。

棧是Vector的一個子類,它實現了一個標準的後進先出的棧。

堆棧只定義了預設構造函數,用來創建一個空棧。 堆棧除了包括由Vector定義的所有方法,也定義了自己的一些方法。

Stack()

除了由Vector定義的所有方法,自己也定義了一些方法:

序號方法描述
1 boolean empty() 
測試堆棧是否為空。
2 Object peek( )
查看堆棧頂部的對象,但不從堆棧中移除它。
3 Object pop( )
移除堆棧頂部的對象,並作為此函數的值返回該對象。
4 Object push(Object element)
把項壓入堆棧頂部。
5 int search(Object element)
返回對象在堆棧中的位置,以 1 為基數。

 

package three;

import java.util.*;

public class myStack {
       static void showpush(Stack st, int a) {
          st.push(new Integer(a));
          System.out.println("push(" + a + ")");
          System.out.println("stack: " + st);
       }

       static void showpop(Stack st) {
          System.out.print("pop -> ");
          Integer a = (Integer) st.pop();
          System.out.println(a);
          System.out.println("stack: " + st);
       }
       
       public static void main(String args[]) {
          Stack st = new Stack();
          System.out.println("stack: " + st);
          showpush(st, 42);
          showpush(st, 66);
          showpush(st, 99);
          showpop(st);
          showpop(st);
          showpop(st);
          try {
               showpop(st);
             } catch (EmptyStackException e) {
               System.out.println("empty stack");
          }
       }
       /*輸出結果:
        stack: []
        push(42)
        stack: [42]
        push(66)
        stack: [42, 66]
        push(99)
        stack: [42, 66, 99]
        pop -> 99
        stack: [42, 66]
        pop -> 66
        stack: [42]
        pop -> 42
        stack: []
        pop -> empty stack
        * */
}
practice

 

字典(Dictionary)

字典(Dictionary) 類是一個抽象類,它定義了鍵映射到值的數據結構。

當你想要通過特定的鍵而不是整數索引來訪問數據的時候,這時候應該使用Dictionary。

由於Dictionary類是抽象類,所以它只提供了鍵映射到值的數據結構,而沒有提供特定的實現。

Dictionary 類是一個抽象類,用來存儲鍵/值對,作用和Map類相似。

給出鍵和值,你就可以將值存儲在Dictionary對象中。一旦該值被存儲,就可以通過它的鍵來獲取它。所以和Map一樣, Dictionary 也可以作為一個鍵/值對列表。

Dictionary定義的抽象方法如下表所示:

序號 方法描述
1 Enumeration elements( )
返回此 dictionary 中值的枚舉。
2 Object get(Object key)
返回此 dictionary 中該鍵所映射到的值。
3 boolean isEmpty( )
測試此 dictionary 是否不存在從鍵到值的映射。
4 Enumeration keys( )
返回此 dictionary 中的鍵的枚舉。
5 Object put(Object key, Object value)
將指定 key 映射到此 dictionary 中指定 value。
6 Object remove(Object key)
從此 dictionary 中移除 key (及其相應的 value)。
7 int size( )
返回此 dictionary 中條目(不同鍵)的數量。

 

哈希表(Hashtable)

Hashtable類提供了一種在用戶定義鍵結構的基礎上來組織數據的手段。

例如,在地址列表的哈希表中,你可以根據郵政編碼作為鍵來存儲和排序數據,而不是通過人名。

哈希表鍵的具體含義完全取決於哈希表的使用情景和它包含的數據。

Hashtable是原始的java.util的一部分, 是一個Dictionary具體的實現 。

然而,Java 2 重構的Hashtable實現了Map介面,因此,Hashtable現在集成到了集合框架中。它和HashMap類很相似,但是它支持同步。

像HashMap一樣,Hashtable在哈希表中存儲鍵/值對。當使用一個哈希表,要指定用作鍵的對象,以及要鏈接到該鍵的值。

然後,該鍵經過哈希處理,所得到的散列碼被用作存儲在該表中值的索引。

Hashtable定義了四個構造方法。

Hashtable()
Hashtable(int size)    //創建指定大小的哈希表
Hashtable(int size,float fillRatio)    //創建一個指定大小的哈希表,並且通過fillRatio指定填充比例。填充比例必須介於0.0和1.0之間,它決定了哈希表在重新調整大小之前的充滿程度
Hashtable(Map m)    //創建一個以M中元素為初始化元素的哈希表。哈希表的容量被設置為M的兩倍。

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 字元 ", " (逗號加空格)分隔開的、括在括弧中的一組條目。

 

package three;


import java.util.*;

public class myHashTable {
    public static void main(String args[]) {
          // Create a hash map
          Hashtable balance = new Hashtable();
          Enumeration names;
          String str;
          double bal;

          balance.put("Zara", new Double(3434.34));
          balance.put("Mahnaz", new Double(123.22));
          balance.put("Ayan", new Double(1378.00));
          balance.put("Daisy", new Double(99.22));
          balance.put("Qadir", new Double(-19.08));

          // Show all balances in hash table.
          names = balance.keys();
          while(names.hasMoreElements()) {
             str = (String) names.nextElement();
             System.out.println(str + ": " +
             balance.get(str));
          }
          System.out.println();
          // Deposit 1,000 into Zara's account
          bal = ((Double)balance.get("Zara")).doubleValue();
          balance.put("Zara", new Double(bal+1000));
          System.out.println("Zara's new balance: " +
          balance.get("Zara"));
       }
    
    /*輸出結果
    Qadir: -19.08
    Zara: 3434.34
    Mahnaz: 123.22
    Daisy: 99.22
    Ayan: 1378.0
    
    Zara's new balance: 4434.34
     * */
}
practice

 

屬性(Properties)

Properties 繼承於 Hashtable.Properties 類表示了一個持久的屬性集.屬性列表中每個鍵及其對應值都是一個字元串。

Properties 類被許多Java類使用。例如,在獲取環境變數時它就作為System.getProperties()方法的返回值。

Properties 定義如下實例變數.這個變數持有一個Properties對象相關的預設屬性列表。

Properties defaults;

Properties類定義了兩個構造方法。

Properties()    //第一個構造方法沒有預設值。
Properties(Properties propDefault)    //使用propDefault 作為預設值。
兩種情況下,屬性列表都為空

除了從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 表中的屬性列表(鍵和元素對)寫入輸出流。

 

package three;


import java.util.*;

public class myProperties {
       public static void main(String args[]) {
          Properties capitals = new Properties();
          Set states;
          String str;
          
          capitals.put("Illinois", "Springfield");
          capitals.put("Missouri", "Jefferson City");
          capitals.put("Washington", "Olympia");
          capitals.put("California", "Sacramento");
          capitals.put("Indiana", "Indianapolis");

          // Show all states and capitals in hashtable.
          states = capitals.keySet(); // get set-view of keys
          Iterator itr = states.iterator();
          while(itr.hasNext()) {
             str = (String) itr.next();
             System.out.println("The capital of " +
                str + " is " + capitals.getProperty(str) + ".");
          }
          System.out.println();

          // look for state not in list -- specify default
          str = capitals.getProperty("Florida", "Not Found");
          System.out.println(
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.使用背景 1. SignalR是什麼? ASP.NET SignalR 是為 ASP.NET 開發人員提供的一個庫,可以簡化開發人員將實時 Web 功能添加到應用程式的過程。實時 Web 功能是指這樣一種功能:當所連接的客戶端變得可用時伺服器代碼可以立即向其推送內容,而不是讓伺服器等待客戶端請求 ...
  • 此Demo是採用VS自帶的Chart圖表控制項,製作實時動態顯示的折線圖,和波形圖。 涉及到知識如下: Chart 控制項,功能強大,可以繪製柱狀圖,折線圖,波形圖,餅狀圖,大大簡化了對圖的開發與定製。 Chart控制項的相關概念: ChartArea,表示圖表區域,一個Chart可以繪製多個ChartA ...
  • 在IIS上安裝Kooboo CMS Kooboo CMS安裝之後 安裝的常見問題 1. 在IIS上安裝Kooboo CMS Kooboo CMS部署到正式環境相當簡單,安裝過程是一個普通MVC站點在IIS上的架設過程,沒有額外的配置步驟。首先從 "這裡" 下載最新版本的Kooboo CMS安裝包以備 ...
  • 反射 System.Reflection 命名空間下的類與 System.Type 命名空間使你能夠獲取有關載入的程式集和其中定義的類型的有關信息,如類、介面和值類型等。 可以使用反射在運行時創建、調用和訪問類型實例。 CLR 程式管理應用程式域,應用程式域構成具有相同應用程式範圍的對象周圍定義的邊 ...
  • 不知道在博客園寫過的文章是否可以更改,特此測試!!! ...
  • jdbc連接資料庫的四個對象 DriverManager 驅動類 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建議使用 原因有2個: > 導致驅動被註冊2次。 > 強烈依賴資料庫的驅動jar 解決辦法: Class.forNa ...
  • 似乎隔三差五就能看到一些關於架構師應不應該寫代碼的文章。我是屬於寫代碼派,因為我本身就喜歡寫代碼。但是,當工作職責發生變化之後,如何保持寫代碼和其它工作之間的平衡就成了問題。 從個體效率上來看,我自己親自寫代碼,和很多人相比沒有什麼絕對優勢,甚至有些人碼代碼的速度比我還快一些。 但作為架構師,參與寫 ...
  • 一、變數的概念: (1)記憶體中的一個存儲區域 (2)該區域有自己的名稱(變數名)和類型(數據類型) (3)Java中每個變數必須先聲明,後使用 (4)該區域的數據可以在同一類型範圍內不斷變化 使用變數註意: (1)變數的作用域:一對{ }之間有效 (2)初始化值 定義變數的格式:數據類型 變數名 = ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...