接上一篇List接口,继续
一.Set接口
1.概述
Set接口存储的是无序,不可重复的数据。
无序性:不等于随机性,存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值进行判断的
不可重复性:保证添加的元素按照equals()判断,不能返回True
public static void main(String[] args) {
//创建集合
HashSet<String> set = new HashSet<String>();
//添加数据:无序的
set.add("张三");
set.add("李四");
set.add("王五");
set.add("赵六");
System.out.println(set);
//不重复
set.add("张三");
System.out.println(set);
}
2.Set子类
Set子类 | 概述 |
---|---|
HashSet | 作为Set接口的主要实现类,线程不安全,可以存储null值 |
LinkedHashSet | 作为HashSet的子类,遍历其内部数据时,可以按照其添加的顺序遍历 |
TreeSet | 可以按照添加对象的指定属性,进行排序 |
3.HashSet
其底层的实现原理和HashMap的底层原理类似,会在HashMap中详细说明
4.LinkedHashSet
作为HashSet的子类,在添加数据的同时,每个数据还维护了两个指针,记录了此数据前一个和后一个数据;
其优点:作为频繁的遍历操作,使用LinkedHashSet的效率高于HashSet
4.TreeSet
向TreetSet中添加数据要求的是相同的数据对象
5.TreeSet的两种排序
①自然排序
比较的是两个对象是否相同的标准是CompareTo,返回0,不再是equals()
public class Person implements Comparable<Person>{
String name;
int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", 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;
Person other = (Person) 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 int compareTo(Person person) {
int ret = this.age - person.age;
if (ret == 0) {
ret =this.name.compareTo(person.name);
}
return ret;
}
}
测试类
public static void main(String[] args) {
TreeSet<Person> tree = new TreeSet<Person>();
//添加数据
tree.add(new Person("san", 12));
tree.add(new Person("si", 2));
tree.add(new Person("wu", 14));
tree.add(new Person("liu", 20));
tree.add(new Person("qi", 15));
System.out.println(tree);
}
方法二:使用比较器进行比较
public class Person1 {
String name;
int age;
public Person1(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", 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;
Person other = (Person) 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;
}
}
测试类
public class Demo02 {
public static void main(String[] args) {
Comparator<? super Person1> comparator = new Comparator<Person1>() {
@Override
public int compare(Person1 person1, Person1 person2) {
int ret = person1.age - person2.age;
if (ret==0) {
//年龄相同,比较姓名
ret = person1.name.compareTo(person2.name);
}
return ret;
}
};
TreeSet<Person1> tree = new TreeSet<Person1>(comparator);
//添加数据
tree.add(new Person1("san", 12));
tree.add(new Person1("si", 2));
tree.add(new Person1("wu", 14));
tree.add(new Person1("liu", 20));
tree.add(new Person1("qi", 15));
System.out.println(tree);
}
}