Set 和 HashSet

Set 接口也是 Collection 接口的子接口, 它有一个很重要也是很常用的实现类—-HashSet.
Set 是元素无需并且不包含重复元素的Collection(List可以重复), 被称为集

HashSet 由哈希表(实际上是一个HashMap实例)支持. 它不保证set的迭代顺序; 特别是它不保证该顺序恒久不变

示例代码:

假设现在学生们要做项目,每个项目有一个组长,由组长来组织组员,我们便来实现项目组的管理吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// PD.java
import java.util.HashSet;
import java.util.Set;
/*
* 项目组长类
*/
public class PD {

public String id;
public String name;
//集合后面的<>代表泛型的意思
//泛型是规定了集合元素的类型
public Set<Student> students;
public PD(String id, String name){
this.id = id;
this.name = name;
this.students = new HashSet<Student>();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 学生类
*/
// Student.java
public class Student {
public String id;
public String name;
public Student(String id, String name){
this.id = id;
this.name = name;
}

@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}

管理成员类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// SetTest.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class SetTest {

public List<Student> students;

public SetTest() {
students = new ArrayList<Student>();
}

/*
* 用于往students中添加学生
*/
public void testAdd() {
//创建一个学生对象,并通过调用add方法,添加到学生管理List中
Student st1 = new Student("1", "张三");
students.add(st1);

//添加到List中的类型均为Object,所以取出时还需要强转

Student st2 = new Student("2","李四");
students.add(st2);

Student[] student = {new Student("3", "王五"),new Student("4", "马六")};
students.addAll(Arrays.asList(student));

Student[] student2 = {new Student("5", "周七"),new Student("6", "赵八")};
students.addAll(Arrays.asList(student2));

}

/**
* 通过for each 方法访问集合元素
* @param args
*/
public void testForEach() {
System.out.println("有如下学生(通过for each):");
for(Object obj:students){
Student st = (Student)obj;
System.out.println("学生:" + st.id + ":" + st.name);
}
}

public static void main(String[] args){
SetTest st = new SetTest();
st.testAdd();
st.testForEach();
PD pd = new PD("1","张老师");
System.out.println("请:" + pd.name + "选择小组成员!");
//创建一个 Scanner 对象,用来接收从键盘输入的学生 ID
Scanner console = new Scanner(System.in);

for(int i = 0;i < 3; i++){
System.out.println("请输入学生 ID");
String studentID = console.next();
for(Student s:st.students){
if(s.id.equals(studentID)){
pd.students.add(s);
}
}
}
st.testForEachForSer(pd);
// 关闭 Scanner 对象
console.close();
}
//打印输出,老师所选的学生!Set里遍历元素只能用foreach 和 iterator
//不能使用 get() 方法,因为它是无序的,不能想 List 一样查询具体索引的元素
public void testForEachForSer(PD pd){
for(Student s: pd.students) {
System.out.println("选择了学生:" + s.id + ":" + s.name);
}
}

}

编译运行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ javac PD.java SetTest.java Student.java
$ java SetTest
有如下学生(通过for each):
学生:1:张三
学生:2:李四
学生:3:王五
学生:4:马六
学生:5:周七
学生:6:赵八
请:张老师选择小组成员!
请输入学生 ID
4
请输入学生 ID
5
请输入学生 ID
6
选择了学生:4:马六
选择了学生:5:周七
选择了学生:6:赵八