概述
java.util.Set 接口和java.util.List 接口一样,同样继承自Collection 接口,它与Collection 接口中的方法基本一致,并没有对Collection 接口进行功能上的扩充,只是比Collection 接口更加严格了。
Set接口中元素无需,并且不可重复
HashSet
java.util.HashSet
是Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)
HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,具有良好的存取和查找性能。
保证元素唯一性的方式依赖于: hashCode
与equals
方法。
package Demo2;
import java.util.HashSet;
import java.util.Iterator;
public class Demo2 {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("锄禾日当午");
set.add("汗滴禾下土");
set.add("谁知盘中餐");
set.add("粒粒皆辛苦");
set.add("锄禾日当午");
/* Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}*/
for (String s:set) {
System.out.println(s);
}
}
}
由于HashSet利用散列表存储,因此无法保证存储顺序,是无序的。
并且添加重复元素也是无效的
TreeSet
TreeSet是属于排序的子类,因此TreeSet能够保存元素的有序性。
注意:此处的有序并非指按照输入顺序排序,而是保证Unicode排序顺序
package Demo2;
import java.util.Set;
import java.util.TreeSet;
public class Demo3 {
public static void main(String[] args) {
Set<String> all = new TreeSet<>();
all.add("D");
all.add("X");
all.add("A");
System.out.println(all);
}
}
//输出:[A, D, X]
虽然在增加元素的时候属于无序的操作,但是增加之后却可以为用户进行排序功能的实现。
当需要比较自己定义的类,则需要实现Comparable接口,并根据需要叙述排序规则
package Demo2;
import java.util.Objects;
import java.util.Set;
import java.util.TreeSet;
public class Demo3 {
public static void main(String[] args) {
TreeSet<Person> data = new TreeSet<>();
Person p1 = new Person("张三",18);
Person p2 = new Person("李四",20);
data.add(p1);
data.add(p2);
for (Person p:data){
System.out.println(p);
}
}
static class Person implements Comparable<Person>{
private String name;
private int age;
@Override
public int compareTo(Person o) {
//this与o比较
//返回的数据 负数 this小/0相等/正数this大
if (this.age>o.age){
return 1;
}else if(this.age == o.age){
return 0;
}else {
return -1;
}
}
public Person() {
}
public Person(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 boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
}
LinkedHashSet
HashSet可以保证元素唯一,但元素存放进去是无序的。当需要保证有序的时候,则可以使用HashSet下面的一个子类LinkedHashSet
,它是链表和哈希表组合的一个数据存储结构。