Set接口:
Set'接口与List接口一样,同样继承自Collection接口,它与Collection
接口中的方法基本一致,并没有对Collection
接口进行功能上的扩充,只是比Collection
接口更加严格了。与List
接口不同的是,Set
接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
Set
集合有多个子类,这里我们介绍其中的java.util.HashSet
、java.util.LinkedHashSet
这两个集合。
HashSet集合:
HashSet是Set接口的一个实现类,他存储的元素是不可重复的,并且元素都是无序的。
演示:
public class HashSetDemo {
public static void main(String[] args) {
//创建 Set集合
HashSet<String> set = new HashSet<String>();
//添加元素
set.add(new String("cba"));
set.add("abc");
set.add("bac");
set.add("cba");
//遍历
for (String name : set) {
System.out.println(name);
}
}
}
输出结果:
cba
abc
bac
由此可说明,Set集合中不能存储重复的元素。
用HashSet存储自定义类型元素:
给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一
两个自定义的对象,在set集合中判断是否相同 必须重写equals和hashCode方法
创建自定义Student类
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
import java.util.HashSet;
public class HashSetDemo02 {
public static void main(String[] args) {
HashSet<Student> stuSet = new HashSet<Student>();
stuSet.add(new Student("血小板",10));
stuSet.add(new Student("红细胞",20));
stuSet.add(new Student("白细胞",23));
stuSet.add(new Student("血小板",10));
for(Student stu01 : stuSet) {
System.out.println(stu01);
}
}
}
执行结果:
Student [name=白细胞, age=23]
Student [name=血小板, age=10]
Student [name=红细胞, age=20]
LinkHashSet:
我们知道HashSet保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢?
在HashSet下面有一个子类java.util.LinkedHashSet
,它是链表和哈希表组合的一个数据存储结构。
演示代码如下:
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSetDemo01 {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<String>();
set.add("血小板");
set.add("红细胞");
set.add("白细胞");
set.add("B细胞");
System.out.println(set);
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
结果: [血小板, 红细胞, 白细胞, B细胞]
血小板
红细胞
白细胞
B细胞