Java 的集合框架将一些常用的数据结构封装成类,相当于 C++ STL 库中实现的抽象数据类型。其中声明了对各种集合类型执行的一般操作。如下定义了实现这些抽象数据类型的接口及它们的继承关系,包括 Set, List, Queue, Map, SortedSet, SortedMap 等,继承关系如下。
Collection 是 Java 定义的一个接口,实现该接口的是一个抽象类 AbstractCollection,通过继承关系,其子类陆续实现了一些抽象数据结构,如下所示。
Collection 接口中定义了一些常用方法,包括:
Set 为集合接口,其中的 equals() 方法重写了 Object 类中的 equals() 方法。Object 类中的 equals() 方法是当比较的对象是同一个时,而不是内容相同才返回 true。而 Set 类中的 equals() 方法是判断两个对象的内容是否相同。
基础的类包括 Hashset, TreeSet
其它实现的类和其子类:
SortedSet 接口中的元素是升序排列的(C++ 中的 set 类本身是排好序的,相当于实现了这里的 SortedSet 接口),而且增加了和次序有关的操作,常用语存放词汇表这样的内容。实现它的类包括:ConcurrentSkipListSet, TreeSet。
List 接口中可包含重复的元素,而且每个元素是有顺序的,每个元素都有一个 index 值(从 0 开始)标明元素在列表中的位置。
先进先出(FIFO)
Map 用于维护键值对 (Key - Value),其中键的值不能重复,键和值的类型可以不同,所以泛型的传入类型有连个,分别为 Key 和 Value。
是 Map 的子接口,其中的关键字是升序排列的(C++ 中的 map 类实现时其实就将关键字排序了)。
大多用于 List 对象,对标 C++ STL 中的 algorithm。其中的 min() 和 max() 适用于任何的实现了 Collection 接口的对象。
和 C++ 中的 sort 差不多
用于将 List 中的元素打乱,采用随机的方式打乱。
可以用于任何集合对象,min() 返回最小值,max() 返回最大值。同样默认按照自然顺序规则计算返回,也可以自己定义 Comparator 对象自己定义比较规则。
测试数组的复制和填充
import java.util.Arrays;
public static void copyArrays(){
int[] a = new int[6];
int[] b = new int[10];
Arrays.fill(a, 47);
Arrays.fill(b, 99);
for(int i: a){
System.out.print(i+"\t");
}
System.out.println();
for(int i: b){
System.out.print(i+"\t");
}
System.out.println();
System.arraycopy(a, 0, b, 0, a.length);
for(int i: b){
System.out.print(i+"\t");
}
System.out.println();
int[] c = new int[5];
Arrays.fill(c, 103);
System.arraycopy(c, 0, a, 0, c.length);
for(int i: a){
System.out.print(i+"\t");
}
System.out.println();
Integer[] u = new Integer[5];
Integer[] v = new Integer[14];
Arrays.fill(u, new Integer(34));
Arrays.fill(v, new Integer(50));
System.arraycopy(u, 0, v, 5, u.length);
for(Integer i: v){
System.out.print(i+"\t");
}
System.out.println();
}
测试的结果如下:
47 47 47 47 47 47
99 99 99 99 99 99 99 99 99 99
47 47 47 47 47 47 99 99 99 99
103 103 103 103 103 47
50 50 50 50 50 34 34 34 34 34 50 50 50 50
测试数组的比较
import java.util.Arrays;
public static void compareArrays(){
int[] a1 = new int[10];
int[] a2 = new int[10];
Arrays.fill(a1, 7);
Arrays.fill(a2, 7);
System.out.println(Arrays.equals(a1, a2));
a2[3] = 11;
System.out.println(Arrays.equals(a1, a2));
String[] s1 = new String[5];
Arrays.fill(s1, "Hi");
String[] s2 = {"Hi", "Hi", "Hi", "Hi", "Hi"};
System.out.println(Arrays.equals(s1, s2));
}
结果如下:
true
false
true
举例如下:
import java.util.Vector;
import java.util.Iterator;
public static void iteratorTester(){
String[] num = {"one", "two", "three", "four", "five",
"six", "seven", "eight", "nine", "ten"};
// 使用 asList() 将num包装成 ArrayList 类型
Vector<String> avec = new Vector<>(java.util.Arrays.asList(num));
System.out.println("Before Vector: " + avec);
Iterator<String> it = avec.iterator();
while(it.hasNext()){
String s = (String)it.next();
System.out.println(s);
if(s.length()>4) it.remove();
}
System.out.println("After Vector: " + avec);
}
结果如下:
Before Vector: [one, two, three, four, five, six, seven, eight, nine, ten]
one
two
three
four
five
six
seven
eight
nine
ten
After Vector: [one, two, four, five, six, nine, ten]
举例如下:
public static void forTester(){
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");
for(String day: dayNames){
System.out.println(day);
}
}
Map 存储 key - value 类型的数据,通过 key 可以实现对值得快速存取和使用
有两个主要实现的类,包括 HashTable(java 1.0) 和HashMap(java 1.2)