最近有个需求要求查询按照单号查询顺序,数据库是hbase,我看了之前代码没有通过查hbase进行排序,就问了前端看是否前端可以排序,答案是前端不会做排序;有2个接口其中之前的接口就是这样排序的,于是我就按个排查看不同之处,打断点看,最后发现了原来是查询条件一个是List接口接收,一个是Set集合接收;所以这里我就写下它2个集合的区别;
转自:https://www.cnblogs.com/kennyliu/p/4026762.html
对于Set 和 List都是 接口 Collection 的子接口
1、Set 不允许重复,List允许重复
2、Set 没有顺序,List有顺序
另外:对于List当中,有没有重复元素的判断:是依据元素的 equals方法判断是否相等的。
对于排序来说,是根据元素实现了Comparable接口compareTo()方法来排序的。
list集合的排序主要有以下几种排序方式:
1、Collections.sort(java对象)
这种方式需要满足以下条件:
1.1、list集合中元素的数据类型是一个java对象;
1.2、该java对象必须实现Comparable类;
1.3、重写compareTo方法;
其中 compareTo 方法用于指示当前元素与其他元素的比较规则,一般都是以 a - b 的形式返回int类型,表示排序规则为从 a 到 b 排序,其逻辑理解就是:如果compareTo方法返回值小于0,则当前元素往前放,大于0,则往后放。
@Data
public class Student implements Comparable<Student> {
private String name;
private int age;
@Override
public int compareTo(@NotNull Student o) {
return getAge() - o.getAge();
}
}
@SpringBootTest
public class TestUtil {
@Test
public void sortTest() {
List<Student> list = new ArrayList<>();
Student std = new Student();
std.setName("小王");
std.setAge(10);
Student std2 = new Student();
std2.setName("小张");
std2.setAge(6);
Student std3 = new Student();
std3.setName("小程");
std3.setAge(8);
list.add(std);
list.add(std2);
list.add(std3);
//排序前
System.out.println(JSONObject.toJSONString(list));
//排序后
Collections.sort(list);
System.out.println(JSONObject.toJSONString(list));
list.toArray();
}
}
打印结果:
2、Collections.sort(java对象集合, new Comparator<>() {});
这种方式与需要满足以下条件:
1.1、list集合中元素的数据类型是一个java对象;
1.2、重写compare方法;
@Data
@AllArgsConstructor
public class Student {
private String name;
private int age;
}
@SpringBootTest
public class TestUtil {
@Test
public void sortTest() {
List<Student> list = new ArrayList<>();
Student std = new Student("小王",10);
Student std2 = new Student("小张",6);
Student std3 = new Student("小程",8);
list.add(std);
list.add(std2);
list.add(std3);
//排序前
System.out.println("排序前:");
System.out.println(JSONObject.toJSONString(list));
//排序后
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student stu1, Student stu2) {
return stu1.getAge()- stu2.getAge();
}
});
System.out.println("排序后:");
System.out.println(JSONObject.toJSONString(list));
}
}
Comparator 和 Comparable 的区别和理解:
Comparator 可以看成是外部比较器,因为它是先有list集合,然后再对list集合用比较器去排序;
Comparable 可以看成是内部比较器,因为它是直接在java对象实现类添加了比较器,因此是先有比较器,然后再对list集合用比较器去排序;
从上面两点,也可以推测出 Comparable 的排序算法的效率应该是比 Comparator 要高效的。
Comparator :使用了匿名内部类来构建了一个Comparator比较器对象,从而实现排序,优点是:不需要在创建java对象时,实现 Comparable 接口,缺点是效率比 Comparable 要低一些。
原文链接:https://blog.csdn.net/weixin_42585386/article/details/123735556