1. HashSet
java.util.HashSet 实现java.util.Set 接口。 List 容器中的对象可以重复,但Set 容器中的对象都是唯一的,Set 容器有自己的排序规则。
HashSet 的排序方法是利用哈希法,所以加入HashSet 容器的对象还必须重新定义hashCode() 方法。HashSet 根据哈希码来确定对象在容器中存储的位置,也可以根据哈希码来快速找到容器中的对象。
在比较两个加入HashSet 容器中的对象是否相同时,会先比较hashCode() 方法返回值是否相同。如果相同在使用equals() 方法比较。
事实上在定义类时,最好总是重新定义equals() 与hashCode() 方法。
下面使用HashSet 的例子:
package hash;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
public class HashSetDemo {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
Scanner scanner = new Scanner(System. in );
while ( true ) {
System. out .println( " 请输入对象: " );
String input = scanner.next();
if (input.equals( "quit" )) {
break ;
}
set.add(input);
}
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System. out .println(iterator.next() + " " );
}
System. out .println();
}
}
在上面例子中你可以输入两个相同的字符串,也就是两个相同的对象。但是最后显示 HashSet 里面元素时只显示了一个,这就是 Set 容器的特性。另外迭代 HashSet 中所有的值,其顺序与加入容器的顺序是不一样的,迭代顺序是按照 HashSet 排序后的顺序。
如果想要在迭代的时候按照加入的顺序显示,则可以使用 java.util.LinkedHashSet. 它在内部是按照哈希码进行排序的,然后允许迭代时行为像 LinkedList 。如:
package hash;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSetDemo {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<String>();
set.add( "dengjie" );
set.add( "liuzhongqiu" );
set.add( "bailong" );
set.add( "shensha" );
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System. out .println(iterator.next() + " " );
}
}
}
2. TreeSet
TreeSet 实现Set 接口与java.util.SortedSet 接口,SortedSet 提供相关方法让您有序的取出对应位置的对象,像first(),last() 方法。它使用红黑树结构来对加入的对象进行排序。
package hash;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
Set<String> set = new TreeSet<String>();
Scanner scanner = new Scanner(System. in );
while ( true ) {
System. out .println( " 请输入对象: " );
String input = scanner.next();
if (input.equals( "quit" ))
break ;
set.add(input);
}
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System. out .println(iterator.next() + " " );
}
System. out .println();
}
}
由于加入的是 String 对象,执行结果会自动按照字典顺序进行排序的动作。
3. EnumSet
建立枚举类型的集合
package set;
import java.util.EnumSet;
import java.util.Iterator;
public class EnumSetDemo {
enum FontConstant {
Plain , Bold , Italic
}
public static void main(String[] args) {
// 建立枚举值集合
EnumSet<FontConstant> enumSet = EnumSet.of (FontConstant. Plain ,
FontConstant. Bold );
// 显示集合内容
showEnumSet (enumSet);
showEnumSet (EnumSet.complementOf (enumSet));
}
public static void showEnumSet(EnumSet<FontConstant> enumSet) {
Iterator iterator = enumSet.iterator();
while (iterator.hasNext()) {
System. out .println(iterator.next() + " " );
}
System. out .println();
}
}
上面例子可以指定枚举值加入 EnumSet 中,使用 of() 方法会返回一个 EnumSet 实例,其中包括所指定的枚举值。也可以使用 complementOf() 指定一个 EnumSet 的互补集。
因为 EnumSet 实现了 Set 接口,可以使用 Set 接口的方法来测试它所包括的枚举值 . 例如测试一个集合是否包括 FontConstant.Bold:
if (enumSet.contains(FontConstant. Bold ))
{
System. out .println( " 包括 FontConstant.Bold" );
}
else
System. out .println( " 不包括 FontConstant.Bold" );
下面是使用 Set 接口方法的 EnumSet
4. Map 类
实现 java.util.Map 接口的对象会将键( Key )映射至值( Value ),值指的是要存入 Map 容器的对象。在将对象存入 Map 对象时,需要同时给定一个键,要取回时可以指定键,这样就可以取得与键对应的对象值。 Map 中的每一个键都是唯一的。 Map 有自己的排序规则。
4.1 HashMap
Map 的特性就是键值对应。就是说要取回一个对象需要一个键对应这个对象。 HashMap 内部实现的是哈希法。下面是例子:
package map;
import java.util.HashMap;
import java.util.Map;
public class HashMapDemo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
String key1 = "dengjie" ;
String key2 = "bailong" ;
map.put(key1 , "dengjie 的信息 " );
map.put(key2, "bailong 的信息 " );
System. out .println(map.get(key1 ));
System. out .println(map.get(key 2));
}
}
可以使用 values() 方法返回一个实现 Collection 的对象,其中包括所有的值对象。如果需要一次迭代 Map 中所有对象,这个会有用。如下:
package map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapDemo2 {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put( "dengjie" , "dengjie 的信息 " );
map.put( "bailong" , "bailong 的信息 " );
map.put( "liuzhongqiu" , "liuzhongqiu 的信息 " );
map.put( "shensha" , "shensha 的信息 " );
Collection collection = map.values();
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
System. out .println(iterator.next() + " " );
}
System. out .println();
}
}