java工具包提供了强大的数据接口;在Java中数据结构主要包括以下几种接口和类

  • 枚举(Enumeration)
  • 位集合(BitSet)
  • 向量(Vector)
  • 栈(Stack)
  • 字典(Dictionary)
  • 哈希表(Hashtabel)
  • 属性(Properties)

    枚举(Enumeration)

    Java Enumeration接口

    Enumeration接口中定义了一些方法,通过这些方法可以枚举(一次获取一个)对象集合中的元素
    这种传统接口已被迭代器取代,虽然Enumeration还未被遗弃,但是现代代码中已经被很少使用了;尽管如此,它还是使用在诸如Vector和Properties这些传统类所定义的方法中,除此之外,还用在一些API类,并且在应用程序中也广泛被使用;下表总结了一些Enumeration声明的方法
序号 方法描述
1 boolean hasMoreElements() 测试此枚举是否包含更多元素
2 Object nextElement() 如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素

实例

  1. import java.util.Vector;
  2. import java.util.Enumeration;
  3. public class EnumerationTester {
  4. public static void main(String args[]) {
  5. Enumeration<String> days;
  6. Vector<String> dayNames = new Vector<String>();
  7. dayNames.add("Sunday");
  8. dayNames.add("Monday");
  9. dayNames.add("Tuesday");
  10. dayNames.add("Wednesday");
  11. dayNames.add("Thursday");
  12. dayNames.add("Friday");
  13. dayNames.add("Saturday");
  14. days = dayNames.elements();
  15. while (days.hasMoreElements()){
  16. System.out.println(days.nextElement());
  17. }
  18. }
  19. }
  20. //结果为:
  21. Sunday
  22. Monday
  23. Tuesday
  24. Wednesday
  25. Thursday
  26. Friday
  27. Saturday

位集合(BitSet)

Java Bitset类

一个Bitset类创建一种特殊类型的数组来保持位值;BitSet中数组大小会随着需要增加;这和位向量(vector of bits)比较类似。
这是一个传统的类,但它在Java2中被完全重新设计
BitSet定义了两个构造方法。
第一个构造方法创建了一个默认的对象:

  1. BitSet()

第二个方法允许用户指定初始大小,所有位初始化为0

  1. BitSet(int size)

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参数执行逻辑异或操作

实例

  1. import java.util.BitSet;
  2. public class BitSetDemo {
  3. public static void main(String args[]) {
  4. BitSet bits1 = new BitSet(16);
  5. BitSet bits2 = new BitSet(16);
  6. // set some bits
  7. for(int i=0; i<16; i++) {
  8. if((i%2) == 0) bits1.set(i);
  9. if((i%5) != 0) bits2.set(i);
  10. }
  11. System.out.println("Initial pattern in bits1: ");
  12. System.out.println(bits1);
  13. System.out.println("\nInitial pattern in bits2: ");
  14. System.out.println(bits2);
  15. // AND bits
  16. bits2.and(bits1);
  17. System.out.println("\nbits2 AND bits1: ");
  18. System.out.println(bits2);
  19. // OR bits
  20. bits2.or(bits1);
  21. System.out.println("\nbits2 OR bits1: ");
  22. System.out.println(bits2);
  23. // XOR bits
  24. bits2.xor(bits1);
  25. System.out.println("\nbits2 XOR bits1: ");
  26. System.out.println(bits2);
  27. }
  28. }
  29. 结果为:
  30. Initial pattern in bits1:
  31. {0, 2, 4, 6, 8, 10, 12, 14}
  32. Initial pattern in bits2:
  33. {1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14}
  34. bits2 AND bits1:
  35. {2, 4, 6, 8, 12, 14}
  36. bits2 OR bits1:
  37. {0, 2, 4, 6, 8, 10, 12, 14}
  38. bits2 XOR bits1:
  39. {}

Java Vector类

Vector类实现了一个动态数组;和ArrayList很相似,但是两者时不同的:

  • Vector是同步访问的
  • Vector包含了许多传统的方法,这些方法不属于集合框架

Vector主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况
Vector类支持4中构造方法:

  • 第一种构造方法创建了一个默认的向量,默认大小为10:

    1. Vector()
  • 第二种构造方法创建指定大小的向量

    1. Vector(int size)
  • 第三种构造方法创建指定大小的向量,并且增量用incr指定;增量表示向量每次增加的元素数目:

    1. Vector(int size,int incr)
  • 第四种构造方法创建了一个包含集合c元素的向量:

    1. Vector(Collection c)

    除了从父类继承的方法外Vector还定义了以下方法:
    image.png
    image.png
    image.png
    image.png
    image.png

    实例

    ```java import java.util.*;

public class VectorDemo {

public static void main(String args[]) { // initial size is 3, increment is 2 Vector v = new Vector(3, 2); System.out.println(“Initial size: “ + v.size()); System.out.println(“Initial capacity: “ + v.capacity()); v.addElement(new Integer(1)); v.addElement(new Integer(2)); v.addElement(new Integer(3)); v.addElement(new Integer(4)); System.out.println(“Capacity after four additions: “ + v.capacity());

  1. v.addElement(new Double(5.45));
  2. System.out.println("Current capacity: " +
  3. v.capacity());
  4. v.addElement(new Double(6.08));
  5. v.addElement(new Integer(7));
  6. System.out.println("Current capacity: " +
  7. v.capacity());
  8. v.addElement(new Float(9.4));
  9. v.addElement(new Integer(10));
  10. System.out.println("Current capacity: " +
  11. v.capacity());
  12. v.addElement(new Integer(11));
  13. v.addElement(new Integer(12));
  14. System.out.println("First element: " +
  15. (Integer)v.firstElement());
  16. System.out.println("Last element: " +
  17. (Integer)v.lastElement());
  18. if(v.contains(new Integer(3)))
  19. System.out.println("Vector contains 3.");
  20. // enumerate the elements in the vector.
  21. Enumeration vEnum = v.elements();
  22. System.out.println("\nElements in vector:");
  23. while(vEnum.hasMoreElements())
  24. System.out.print(vEnum.nextElement() + " ");
  25. System.out.println();

} }

结果为 Initial size: 0 Initial capacity: 3 Capacity after four additions: 5 Current capacity: 5 Current capacity: 7 Current capacity: 9 First element: 1 Last element: 12 Vector contains 3.

Elements in vector: 1 2 3 4 5.45 6.08 7 9.4 10 11 12

  1. <a name="PqUaj"></a>
  2. # Java Stack类
  3. 栈是Vector的一个子类,它实现了一个标准的后进先出的栈<br />堆栈只定义了默认构造函数,用来创建一个空栈;堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法
  4. ```java
  5. Stack()

除了由Vector定义的所有方法,自己也定义了一些方法:
image.png

实例

  1. import java.util.*;
  2. public class StackDemo {
  3. static void showpush(Stack<Integer> st, int a) {
  4. st.push(new Integer(a));
  5. System.out.println("push(" + a + ")");
  6. System.out.println("stack: " + st);
  7. }
  8. static void showpop(Stack<Integer> st) {
  9. System.out.print("pop -> ");
  10. Integer a = (Integer) st.pop();
  11. System.out.println(a);
  12. System.out.println("stack: " + st);
  13. }
  14. public static void main(String args[]) {
  15. Stack<Integer> st = new Stack<Integer>();
  16. System.out.println("stack: " + st);
  17. showpush(st, 42);
  18. showpush(st, 66);
  19. showpush(st, 99);
  20. showpop(st);
  21. showpop(st);
  22. showpop(st);
  23. try {
  24. showpop(st);
  25. } catch (EmptyStackException e) {
  26. System.out.println("empty stack");
  27. }
  28. }
  29. }
  30. 结果为
  31. stack: [ ]
  32. push(42)
  33. stack: [42]
  34. push(66)
  35. stack: [42, 66]
  36. push(99)
  37. stack: [42, 66, 99]
  38. pop -> 99
  39. stack: [42, 66]
  40. pop -> 66
  41. stack: [42]
  42. pop -> 42
  43. stack: [ ]
  44. pop -> empty stack

Java Dictionary类

Dictionary类是一个抽象类,用来存储 键/值对,作用和Map类相似
给出键和值,你就可以将值存储在Dictionary对象种;一旦该值被存储,就可以通过它的键来获取它;所有和Map一样,Dictionary也可以作为一个 键/值对列表
image.png
Dictionary类已经过时了;在实际开发中,你可以实现Map接口来获取键值对的存储功能

Java Hashtable类

Hashtable是原始的java.util的一部分,是一个Dictionary具体的实现
然而,Java2重构的Hashtable实现了Map接口,因此,Hashtable现在集成到了集合框架中;它和HashMap类很相似,但是它支持同步
像HashMap一样,Hashtable在哈希表中存储 键/值对;当使用一个哈希表,要指定用作键的对象,以及要链接到该键的值。
然后,该键经过哈希处理,所得到的散列码被用作存储在该表中值的索引
Hashtabel定义了四个构造方法:

  • 第一个是默认构造方法

    1. Hashtable()
  • 第二个构造函数创建指定大小的哈希表

    1. Hashtable(int size)
  • 第三个构造方法创建了一个指定大小的哈希表,并且通过fillRatio指定填充比例(填充比例必须介于0.0和1.0之间,它决定了哈希表在重新调整大小之前的充满程度)

    1. Hashtale(int size,float fillRatio)
  • 第四个构造方法创建了一个以M中元素为初始化元素的哈希表(哈希表的容量被设置为M的两倍)

    1. Hashtable(Map m)

    Hashtable中除了从Map接口中定义的方法外,还定义了以下方法:
    image.png
    image.png

    实例

    ```java import java.util.*;

public class HashTableDemo {

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

  1. balance.put("Zara", new Double(3434.34));
  2. balance.put("Mahnaz", new Double(123.22));
  3. balance.put("Ayan", new Double(1378.00));
  4. balance.put("Daisy", new Double(99.22));
  5. balance.put("Qadir", new Double(-19.08));
  6. // Show all balances in hash table.
  7. names = balance.keys();
  8. while(names.hasMoreElements()) {
  9. str = (String) names.nextElement();
  10. System.out.println(str + ": " +
  11. balance.get(str));
  12. }
  13. System.out.println();
  14. // Deposit 1,000 into Zara's account
  15. bal = ((Double)balance.get("Zara")).doubleValue();
  16. balance.put("Zara", new Double(bal+1000));
  17. System.out.println("Zara's new balance: " +
  18. balance.get("Zara"));

} }

结果为 Qadir: -19.08 Zara: 3434.34 Mahnaz: 123.22 Daisy: 99.22 Ayan: 1378.0

Zara’s new balance: 4434.34

  1. <a name="CnIhQ"></a>
  2. # Java Properties类
  3. Properties继承与Hashtable,表示一个持久的属性集,属性列表中每个键及其对应值都是一个字符串。<br />Properties类被许多Java类使用;例如,在获取环境变量时它就作为System.getProperties()方法的返回值<br />Properties定义如下实例变量,这个变量持有一个Properties对象相关的默认属性列表
  4. ```java
  5. Properties defaults;

Properties类定义了两个构造方法,第一个构造方法没有默认值

  1. Properties()

第二个构造方法使用propDefault作为默认值,两种情况下,属性列表都为空:

  1. Properties(Properties propDefault)

除了从Hashtable中所定义的方法,Properties还定义了以下方法:
image.png

实例

  1. import java.util.*;
  2. public class PropDemo {
  3. public static void main(String args[]) {
  4. Properties capitals = new Properties();
  5. Set states;
  6. String str;
  7. capitals.put("Illinois", "Springfield");
  8. capitals.put("Missouri", "Jefferson City");
  9. capitals.put("Washington", "Olympia");
  10. capitals.put("California", "Sacramento");
  11. capitals.put("Indiana", "Indianapolis");
  12. // Show all states and capitals in hashtable.
  13. states = capitals.keySet(); // get set-view of keys
  14. Iterator itr = states.iterator();
  15. while(itr.hasNext()) {
  16. str = (String) itr.next();
  17. System.out.println("The capital of " +
  18. str + " is " + capitals.getProperty(str) + ".");
  19. }
  20. System.out.println();
  21. // look for state not in list -- specify default
  22. str = capitals.getProperty("Florida", "Not Found");
  23. System.out.println("The capital of Florida is "
  24. + str + ".");
  25. }
  26. }
  27. 结果为:
  28. The capital of Missouri is Jefferson City.
  29. The capital of Illinois is Springfield.
  30. The capital of Indiana is Indianapolis.
  31. The capital of California is Sacramento.
  32. The capital of Washington is Olympia.
  33. The capital of Florida is Not Found.