Java 实用包提供的数据结构非常强大,能够执行广泛的功能。这些数据结构包括以下接口和类:
Enumeration(枚举)
Enumeration
接口本身不是一种数据结构,但在其他数据结构的上下文中非常重要。Enumeration
接口定义了从数据结构中检索连续元素的方式。
例如,Enumeration
定义了一个名为 nextElement
的方法,用于获取包含多个元素的数据结构中的下一个元素。
示例
以下是一个显示 Enumeration
在 Vector
中使用的例子:
import java.util.Vector;
import java.util.Enumeration;
public class EnumerationTester {
public static void main(String args[]) {
Enumeration<String> days;
Vector<String> 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());
}
}
}
输出:
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
BitSet(位集)
BitSet
类实现了可以单独设置和清除的一组位或标志。
这个类在需要跟踪一组布尔值的情况下非常有用;你可以为每个值分配一个位,并根据需要设置或清除它。
示例
以下程序说明了 BitSet
数据结构支持的几种方法:
import java.util.BitSet;
public class BitSetDemo {
public static void main(String args[]) {
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("Initial pattern in bits1: ");
System.out.println(bits1);
System.out.println("\nInitial pattern in bits2: ");
System.out.println(bits2);
bits2.and(bits1);
System.out.println("\nbits2 AND bits1: ");
System.out.println(bits2);
bits2.or(bits1);
System.out.println("\nbits2 OR bits1: ");
System.out.println(bits2);
bits2.xor(bits1);
System.out.println("\nbits2 XOR bits1: ");
System.out.println(bits2);
}
}
输出:
Initial pattern in bits1:
{0, 2, 4, 6, 8, 10, 12, 14}
Initial pattern in bits2:
{1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14}
bits2 AND bits1:
{2, 4, 6, 8, 12, 14}
bits2 OR bits1:
{0, 2, 4, 6, 8, 10, 12, 14}
bits2 XOR bits1:
{}
Vector(向量)
Vector
类类似于传统的 Java 数组,只是它可以随着需要增长以容纳新的元素。
像数组一样,可以通过索引访问 Vector
对象的元素。
使用 Vector
类的好处在于,你不必担心在创建时设置其特定大小;在必要时它会自动收缩和增长。
示例
以下程序说明了 Vector
集合支持的几种方法:
import java.util.*;
public class VectorDemo {
public static void main(String args[]) {
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());
v.addElement(new Double(5.45));
System.out.println("Current capacity: " + v.capacity());
v.addElement(new Double(6.08));
v.addElement(new Integer(7));
System.out.println("Current capacity: " + v.capacity());
v.addElement(new Float(9.4));
v.addElement(new Integer(10));
System.out.println("Current capacity: " + v.capacity());
v.addElement(new Integer(11));
v.addElement(new Integer(12));
System.out.println("First element: " + (Integer)v.firstElement());
System.out.println("Last element: " + (Integer)v.lastElement());
if(v.contains(new Integer(3)))
System.out.println("Vector contains 3.");
Enumeration vEnum = v.elements();
System.out.println("\nElements in vector:");
while(vEnum.hasMoreElements())
System.out.print(vEnum.nextElement() + " ");
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
Stack(栈)
Stack
类实现了后进先出(LIFO)的栈结构。
你可以将栈想象成一个垂直堆叠的对象;当你添加一个新的元素时,它会堆放在其他元素之上。
当你从栈中取出一个元素时,它会从顶部弹出。换句话说,最后添加到栈中的元素是第一个弹出的。
示例
以下程序说明了 Stack
集合支持的几种方法:
import java.util.*;
public class StackDemo {
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
Dictionary(字典)
Dictionary
类是一个抽象类,定义了用于映射键到值的数据结构。
这在你需要通过特定的键而不是整数索引来访问数据的情况下很有用。
由于 Dictionary
类是抽象的,它只提供了基于键映射的数据结构的框架,而不是具体的实现。
示例
以下示例展示了 Java Dictionary
类的 keys()
方法的使用。我们使用 Hashtable
对象创建了一个 Dictionary
实例,然后向其中添加了几个元素。通过 keys()
方法获取了一个枚举,并迭代枚举打印字典的键。
package com.tutorialspoint;
import java.util.Enumeration;
import java.util.Dictionary;
import java.util.Hashtable;
public class DictionaryDemo {
public static void main(String[] args) {
Dictionary<Integer, Integer> dictionary = new Hashtable<>();
dictionary.put(1, 1);
dictionary.put(2, 2);
Enumeration<Integer> enumeration = dictionary.keys();
while(enumeration.hasMoreElements()) {
System.out.println(enumeration.nextElement());
}
}
}
输出:
2
1
Hashtable(哈希表)
Hashtable
类提供了一种基于用户定义的键结构来组织数据的方式。
例如,在地址列表的哈希表中,你可以根据诸如邮政编码这样的键来存储和排序数据,而不是基于一个人的名字。
关于哈希表中键的具体含义完全取决于哈希表的使用方式及其所包含的数据。