HashSet去重 (判断重复机制)
HashSet:无序不可重复的集合,线程不安全的,底层基于HashMap,基于hashCode();
判断重复的机制:
- 先判断当前元素和要添加的元素hashCode()是否相等
- 若hashCode()相等,再判断当前元素和要添加元素equals()是否相等,若相等,则认为两元素相同
TreeSet去重排序机制
TreeSet:无序不可重复的集合,线程不安全的,底层基于红黑树(一种特殊二叉树,有自平衡机制,左叉小,右叉大)
判断重复和排序机制:
自然排序
目标元素类实现Comparable接口,重写compareTo()方法
- 正数: 表示不同元素,升序
- 负数: 表示不同元素,降序
- 0: 表示相同的元素
代码示例:
定义User类自然排序,根据年龄升序,名称长度降序
public class User implements Comparable<User>{
private String name;
private int age;
//get,set,构造方法,toString...
@Override
public int compareTo(User o) {
if(this.age >o.age){
//升序
return 1;
}else if(this.age <o.age){
return -1;
}else {
if(this.name.length()>o.name.length()){
//降序
return -1;
}else if(this.name.length()<o.name.length()){
return 1;
}else {
return 0;
}
}
}
}
测试:
public class Demo {
public static void main(String[] args) {
TreeSet<Object> treeSet = new TreeSet();
treeSet.add(new User("张三",17));
treeSet.add(new User("李思思",17));
treeSet.add(new User("李思思是是是",18));
treeSet.add(new User("李思思说",18));
System.out.println(treeSet);
}
}
结果:
定制排序
在创建TreeSet对象的时候,将一个比较器Comparator子类对象传入,重写compare()方法
- 正数: 表示不同元素,升序
- 负数: 表示不同元素,降序
- 0: 表示相同的元素
注意: 定制排序优先级高于自然排序
代码示例:
定义User类的比较器UserComparetor,根据年龄降序,名称长度升序
public class UserComparetor implements Comparator<User> {
@Override
public int compare(User o1, User o2) {
if(o1.getAge() >o2.getAge()){
return -1;
}else if(o1.getAge() <o2.getAge()){
return 1;
}else {
if(o1.getName().length()>o2.getName().length()){
return 1;
}else if(o1.getName().length()<o2.getName().length()){
return -1;
}else {
return 0;
}
}
}
}
测试:
public class Demo {
public static void main(String[] args) {
TreeSet<Object> treeSet = new TreeSet(new UserComparetor());
treeSet.add(new User("张三",17));
treeSet.add(new User("李思思",17));
treeSet.add(new User("李思思是是是",18));
treeSet.add(new User("李思思说",18));
System.out.println(treeSet);
}
}
结果:可以看出自然排序和定制排序同时存在时,定制排序优先级高