体系结构:均继承于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]
}