集合的特点:
集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。
集合非常适合做元素的增删操作。
注意:集合中只能存储引用类型数据,如果要存储基本类型数据可以选择包装类。
集合适合的场景:数据的个数不确定,需要进行增删元素的时候。
集合都是支持泛型的,可以在编译阶段约束集合只能操作某种数据类型
ArrayList集合底层原理:
ArrayList底层是基于数组实现的:根据索引定位元素快,增删需要做元素的移位操作。
第一次创建集合并添加一个元素的时候,在底层创建一个默认长度为10的数组
LinkedList的特点:
底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API。
推荐使用迭代器删除元素,方法:iterator.remove();
Set系列集合特点
无序:存取顺序不一致
不重复:可以去除重复
无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素
Set集合实现类特点:
HashSet:无序、不重复、无索引。
LinkedHashSet:有序、不重复、无索引。
TreeSet:排序、不重复、无索引。
Set集合的底层原理是什么?
JDK8之前,哈希表:底层使用数组+链表组成
JDK8开始后,哈希表:底层采用数组+链表+红黑树组成
TreeSet集合存储对象的时候有两种方式设计自定义比较规则
让自定义的类 实现Comparable接口,重写里面的compareTo方法来定制比较规则。
TreeSet集合有参数构造器,可以设置Comparator接口对应的比较器对象,来定制比较规则。
注意:如果TreeSet集合存储的对象有实现比较规则,集合也自带比较器,默认使用集合自带的比较器排序
如果希望元素可以重复,又有索引,索引查询要快?
使用ArrayList集合,基于数组的(用的最多)。
如果希望元素可以重复,又有索引,增删首尾操作快?
用LinkedList集合,基于链表的。
如果希望增删改查都快,但是元素不重复、无序、无索引
用HashSet集合,基于哈希表的。
如果希望增删改查都快,但是元素不重复、有序、无索引
用LinkedHashSet集合,基于哈希表和双链表
如果要对对象进行排序
用TreeSet集合,基于红黑树。后续也可以用List集合实现排序。