set集合
Set集合的特点:
保证元素唯一性。
HashSet和TreeSet:
HashSet和TreeSet是Set集合的两个实现类。
HashSet类:
HashSet 集合怎么来保证元素的唯一性:
是靠元素重写hashCode 和 equals() 方法来保证的,如果元素不重写这两个方法则无法保证元素的唯一性,JDK1.7 HashSet的数据结构是 数组跟链表,JDK1.8 HashSet的数据结构是 数组跟链表和二叉树,HashSet 底层存数据时,用HashMap<Key,Value>集合来存
判断两个元素相同的标准是:
两个对象通过equals()方法相等,且HashCode()方法的返回值也相等。如果元素不重写这两个方法则无法保证元素的唯一性。
LinkedHashSet:
LinkedHashSet是HashSet的子类,LinkedHashSet 底层数据结构是 链表和哈希表 链表保证元素有序,哈希表保证唯一,LinkedHashSet 元素有序且唯一 注意,此实现不是同步的 线程不安全 效率高。
TreeSet类
TreeSet 集合的特点:
1.元素唯一,且能对元素进行排序
2.TreeSet 底层的数据结构是二叉树
TreeSet 对元素的排序:
1,自然排序:,采用空参构造时,就用的是自然排序,自然排序要求元素必须实现一个Compareble 接口 并且重写接口中 compareTo 这个比较的方法,根据此方法的返回值的正负0 来决定元素放置到树结构的位置,以及不往里面放
public class MyTest {
public static void main(String[] args) {
TreeSet<Student> set = new TreeSet<>();
set.add(new Student("赵六", 26));
set.add(new Student("赵六2", 26));
set.add(new Student("张三2222", 233));
set.add(new Student("田七", 230));
set.add(new Student("吴八222", 2313));
set.add(new Student("张三22", 23));
set.add(new Student("张三222", 23));
set.add(new Student("李四11111111", 24));
set.add(new Student("王五", 20));
//按照学生的年龄大小进行排序
//按照名字的长度来排序
// System.out.println(set);
for (Student student : set) {
System.out.println(student);
}
}
}
学生类
public class Student implements Comparable<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 String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student student) {
//System.out.println("会调用比较方法");
//如果年龄一样,还得比较姓名
int num = this.age - student.age;
//if(num==0){
// num=this.name.compareTo(student.name);
//}
int num2 = num == 0 ? this.name.compareTo(student.name) : num;
return num2;
}
}