欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

List和Set集合总结

程序员文章站 2022-03-03 08:52:05
...

List有序可重复
1.ArrayList:底层数据结构为数组,查询快,增删慢

2.LinkedList:底层数据结构为链表,增删快,查询慢

Set无序不可重复
1.HashSet(无序,唯一):底层数据结构为哈希表。
依赖两个方法:hashCode()和equals()保证元素唯一性

2.LinkedHashSet(FIFO插入有序,唯一):底层数据结构是链表(保证元素有序)和哈希表(保证元素唯一)。

3.TreeSet(唯一,有序):底层数据结构是红黑树。
自然排序和比较器排序保证元素有序,
根据比较的返回值是否是0来保证元素唯一性。

TreeSet,LinkedHashSet and HashSet的区别

  • TreeSet的主要功能用于排序
  • LinkedHashSet的主要功能用于保证FIFO即有序的集合(先进先出)
  • HashSet只是通用的存储数据的集合

TreeSet两种排序方式
1.自然排序
自然排序要进行一下操作:

  • Student类中实现 Comparable接口
  • 重写Comparable接口中的Compareto方法
public class Student implements Comparable<Student>{
    private String name;
    private int age;

    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Student(String name, int age) {
        super();
        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 int compareTo(Student s) {
        //return -1; //-1表示放在红黑树的左边,即逆序输出
        //return 1;  //1表示放在红黑树的右边,即顺序输出
        //return o;  //表示元素相同,仅存放第一个元素
        //主要条件 姓名的长度,如果姓名长度小的就放在左子树,否则放在右子树
        int num=this.name.length()-s.name.length();
        //姓名的长度相同,不代表内容相同,如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。
        //如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。
        //如果这两个字符串相等,则结果为 0
        int num1=num==0?this.name.compareTo(s.name):num;
        //姓名的长度和内容相同,不代表年龄相同,所以还要判断年龄
        int num2=num1==0?this.age-s.age:num1;
        return num2;
    }
}

2.比较器排序
比较器排序步骤:

  • 单独创建一个比较类,这里以MyComparator为例,并且要让其继承Comparator接口
  • 重写Comparator接口中的Compare方法
public class MyComparator implements Comparator<Student> {

    @Override
    public int compare(Student s1,Student s2) {
        // 姓名长度
        int num = s1.getName().length() - s2.getName().length();
        // 姓名内容
        int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
        // 年龄
        int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
        return num3;
    }

}
相关标签: java