集合List、Set

121 阅读2分钟

体系结构:均继承于Collection,属单列集合

因此,可以使用Collection中定义的方法

List

有序(存和取的顺序是一致的)、可重复、有索引

后续再补充。。。。。。

ArrayList

LinkedList

Set

无序(存和取的顺序是不一致的)、不可重复、无索引

HashSet

注意:在存放自定义对象的时候,需要重写一下java bean中的equals和hashCode方法(不重写的话,默认是按照地址值计算hash值,那样是没有意义的)

LinkedHashSet

继承自HashSet,在其上加了一个双向链表的结构

TreeSet

可排序、不可重复、无索引

注意:

1、可以不重写equals和hashCode方法

2、在向集合中添加元素之前,一般需要之前被添加的元素的排序规则,有2种定义方式:

  • 方式一:默认排序/自然排序(一般使用这个),在java bean中,直接实现Comparable接口,并指定泛型,然后重写compareTo方法
    
  • 方式二:比较器排序,在创建集合对象的时候,在小括号中传入一个Comparator比较器,在其中指定一个排序规则
    

3、compareTo方法返回值:

  • 负数:表示当前要添加的元素是小的,存左边
  • 正数:表示当前要添加的元素是大的,存右边
  • 0:认为元素已经存在,那么舍弃:

方式一示例:

public class Student implements Comparable<Student>{
    private String name;

    private Integer age;
    
    @Override
    public int compareTo(Student o) {
        // 这里的this表示是当前的元素,在调用add方法的时候,会自动地进行调用,
        // o代表已经在红黑树中的元素,它会从根节点出发一个一个地进行比较,当不符合红黑树的规则的时候,会自动旋转
        return this.getAge() - o.getAge();
    }
}
    

方式二示例:

@Test
void test2() {
//        传递一个比较器
    TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            // o1表示当前要添加的元素,o2表示已经在红黑树中的元素
            // 按照长度排序
            int i = o1.length() - o2.length();
            // 长度相等的时候,再按照ASCII表的数字进行排序
            i = i == 0 ? o1.compareTo(o2) : i;
            return i;
        }
    });

    treeSet.add("c");
    treeSet.add("ab");
    treeSet.add("df");
    treeSet.add("qwer");

    System.out.println(treeSet);  // [c, ab, df, qwer]
}

List和Set使用场景选择

image.png