序言:
基本类型在集合中可以直接使用,当我使用自己定以的类型时,在set中需要一种方式来维护存储顺序,而set不同的 实现直接方式也是不同的。
一、set集合
set中的元素是不能重复的,因此加入set的元素必须定以equals方法(引用类型必须重写equals和hashcode),同时set中的不保证维护元素的次序。
1.HashSet:
** 特点:**<br /> ①:查找元素快,存入其中的元素必须定以HashCode方法;
2.TreeSet:
** 特点:**<br /> ①:能够保存元素的次序,底层为树结构(红黑树)。<br /> <br /> ②:可以从set中提取有序的元素,所以元素必须要实现comparable接口。
③:不需要重写hashCode()和equals()方法,去重是依靠比较器来去重
因为结构是红黑树,所以每次插入都会遍历比较来寻找节点插入位置,如果发现某个节点的值是 一样的那就会直接覆盖。
** 示例:**
public class Persons implements Comparable<Persons>{
private String name;
private Integer age;
Persons(){
}
Persons(String name,Integer age){
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "Persons{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Persons o) {
return age<o.age?1:(age>o.age?-1:0);
}
}
class PresonsTest{
public static void main(String[] args) {
Set<Persons> set = new TreeSet<>();
Persons persons = new Persons("aaa",12);
Persons persons2 = new Persons("ccc",15);
Persons persons3 = new Persons("aaa",12);
Persons persons4= new Persons("ddd",10);
Persons persons5= new Persons("ddd",16);
Persons persons6= new Persons("ddd",18);
set.addAll(Arrays.asList(persons,persons2,persons4,persons3,persons6,persons5));
System.out.println(set);
System.out.println(set.contains(persons3));//contains(persons3)也依靠比较器
}
}
3. LInkedHashSet:
**特点:**<br /> ①:既有HashSet的查询速度,同时因为内部是链表存储机构,所以以插入的顺序维护元素,<br /> ②:使用迭代器遍历的时候会安装元素的插入顺序显示。<br /> ③:存入其中的元素也必须要定义hashCode()方法。
二、SortedSet:
SortedSet中的元素可以保证处于排序状态提供的功能有:<br /> ①:**Comparator comparator** 方法,返回set集合使用的comparator,如果返回null,则表示自然排序<br /> ②: <br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12862216/1619007431791-f6e4ac22-ec2d-4a53-8db6-a6c012e4eb61.png#clientId=u1a1d371b-2244-4&from=paste&height=144&id=u60ef654e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=203&originWidth=935&originalType=binary&size=86512&status=done&style=none&taskId=u96285ff5-42e9-4a21-94f0-6d547bc835f&width=661)<br /> 示例
public class SortedSetDemo {
public static void main(String[] args) {
final SortedSet<String> sortedSet = new TreeSet<>();
Collections.addAll(sortedSet, "one two three four five six seven eight".split(" "));
System.out.println(sortedSet);
String first = sortedSet.first();
System.out.println(first);
String last = sortedSet.last();
System.out.println(last);
final Iterator<String> iterator = sortedSet.iterator();
for (int i = 0; i <=6 ; i++) {
if (i==3) {
first= iterator.next();
System.out.println("i==3"+first);}
else if (i==6) {
System.out.println("i==6"+iterator.next());
}else {
System.out.println("其他时候" + iterator.next());
}
}
System.out.println(sortedSet.subSet(first, last));
System.out.println(sortedSet.headSet(last));
System.out.println(sortedSet.tailSet(last));
}
}
注意:SortedSet的意思是按对象的比较函数进行元素排序。