1.Set集合
Set集合也是用来存储数据的
Set也是一个接口
父接口是Collection
存储数据的特征: 无序的 不可重复的
Set接口有两个实现类:
HashSet:
依靠hash值进行存储的,如果两个元素hash值一样的话,就不再存储了
TreeSet:
底层是二叉树,对存储数据进行自然排序
2.HashSet
和ArrayList很像
HashSet存对象【重点】
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
class People{
String name;
int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
People people = (People) o;
return age == people.age && Objects.equals(name, people.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Demo03 {
public static void main(String[] args) {
People people = new People("dmh",22);
People people1 = new People("lxz",22);
Set<People> set = new HashSet<>();
//在调用add方法的时候 底层在调用hashCode方法和equals
set.add(people);
set.add(people1);
System.out.println(set);
}
}
3.TreeSet
和ArrayList很像
TreeSet存对象【重点】
如果想要在TreeSet集合中添加对象的话
要去实现Comparable这个接口
抽象方法:
int compareTo(T o) 将此对象与指定的对象进行比较以进行排序.
将此对象与指定的对象进行比较以进行排序。 返回一个负整数,零或正整数,因为该对象小于,等于或大于指定对象。
stu1.comparetTo(stu2)
得有一个int类数据
好好思考一个问题:你得给我返回一个int类型的数据
stu1有age变量 stu1的年龄 减去 stu2的年领
如果年龄返回值是一个负数的话: stu1的年领小与 stu 2
如果年龄返回值是一个0的话,stu1的年龄和stu2年龄相等
如果年龄返回值是一个正整数的话: stu1的年领大于 stu 2
set.add(stu1); 第一次调用compareTo
stu1和stu1在比较 45-45 =0 只保留 stu1set.add(stu2)的时候
又调用compareTo() 第二次调用compareTo
o:stu1
this: stu2 35 - 45 = -10 负数 stu2 比stu1小 咋排 [stu2, stu1]set.add(stu3)的时候 第三次调用compareTo
this: stu3
o: stu1
[stu3, stu1]第四次调用compareTo
this:stu3
o:stu2 [stu3 stu2]
[stu3 stu2 stu1]
import java.util.Set;
import java.util.TreeSet;
class Test implements Comparable<Test>{
String name;
int age;
public Test(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Test{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Test o) {
int num = this.age-o.age;
return num;
}
}
public class Demo04 {
public static void main(String[] args) {
Test test1 = new Test("demo",22);
Test test2 = new Test("test",20);
Set<Test> set = new TreeSet<>();
set.add(test1);
set.add(test2);
System.out.println(set);
}
}
4.总结
1.HashSet存对象的时候,一定在类中重写equals和hashCode方法
2.TreeSet存对象的时候,一定要实现一个接口Comparable,重写compareTo方法
比较两个对象某个属性的int类型差值