java.util.List和java.util.Set区别

最近有个需求要求查询按照单号查询顺序,数据库是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 {
    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 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 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() {
            @Override
            public int compare(Student stu1, Student stu2) {
                return stu1.getAge()- stu2.getAge();
            }
        });
        System.out.println("排序后:");
        System.out.println(JSONObject.toJSONString(list));
    }

}

java.util.List和java.util.Set区别_第1张图片

Comparator 和 Comparable 的区别和理解

Comparator 可以看成是外部比较器,因为它是先有list集合,然后再对list集合用比较器去排序;

Comparable 可以看成是内部比较器,因为它是直接在java对象实现类添加了比较器,因此是先有比较器,然后再对list集合用比较器去排序;

从上面两点,也可以推测出 Comparable 的排序算法的效率应该是比 Comparator 要高效的

Comparator :使用了匿名内部类来构建了一个Comparator比较器对象,从而实现排序,优点是:不需要在创建java对象时,实现 Comparable 接口,缺点是效率比 Comparable  要低一些
 

原文链接:https://blog.csdn.net/weixin_42585386/article/details/123735556

 

 

你可能感兴趣的:(java,开发语言)