一.Set接口的概述
- Set:是无序的(存储和取出不一致),集合中的元素不可以重复
- Set的子实现类:HashSet,LinkedHashSet,TreeSet
public class Demo1 {
public static void main(String[] args) {
Set<String> s = new HashSet<String> ();
s.add("hello");
s.add("world");
s.add("java");
s.add("!");
for(String a : s){
System.out.println(a);
}
}
}
结果:
!
world
java
hello
二.HashSet
- hashSet:不保证 set 的迭代顺序,特别是不保证该顺序恒久不变
三.LinkedHashed
- LinkedHashSet:底层数据结构是由哈希表和链表实现
- 与hashSet(无序性)区别:
哈希表:保证元素的唯一性
链表:元素的存储和取出一致(有序性)
四.TreeSet
- TreeSet集合底层依赖于TreeMap集合,底层数据结构是红黑树结构(一种自平衡的数结构)
- TreeSet集合保证元素的唯一性(TreeMap的红黑树结构),并且还能排序(自然排序和选择排序)
- TreeSet集合用来存储自定义的对象
使用自然排序:一定要实现Compareable接口(底层要依赖于:compareTo:用此对象与指定对象进行比较)
TreeSet集合默认使用元素的自然顺序对元素进行排序,若当前没有实现Compareable接口进行自然排序,则会出现java.lang.Comparable
类转换异常
比较器排序(Copartor) - 自然排序:
public class Student implements Comparable<Student>{
private String name;
private int age ;
public Student() {
super();
}
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 compareTo(Student s) {
int num = this.age - s.age;
int num2 = num==0 ? this.name.compareTo(s.name) : num ;
return num2 ;
}
}
import java.util.TreeSet;
public class Demo2 {
public static void main(String[] args) {
TreeSet<Student> ts = new TreeSet<Student>() ;
Student s1 = new Student("zhangguorong", 38) ;
Student s2 = new Student("gaoyuanyuan", 27) ;
Student s3 = new Student("wanglihong", 29) ;
Student s4 = new Student("liushishi", 28) ;
Student s5 = new Student("gaoyuanyuan", 27) ;
Student s6 = new Student("zhangsan", 27) ;
Student s7 = new Student("linqingxia", 49) ;
Student s8 = new Student("wuqilong", 38) ;
ts.add(s1) ;
ts.add(s2) ;
ts.add(s3) ;
ts.add(s4) ;
ts.add(s5) ;
ts.add(s6) ;
ts.add(s7) ;
ts.add(s8) ;
for(Student s : ts){
System.out.println(s.getName()+"---"+s.getAge());
}
}
}
结果:
gaoyuanyuan---27
zhangsan---27
liushishi---28
wanglihong---29
wuqilong---38
zhangguorong---38
linqingxia---49