提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
集合两大体系,本篇是关于Collection体系下的List和Set两个集合
一、Collection体系下的两个常用集合
1. List集合
①、定义
List集合是有序的,可以存储重复的数据
由于List集合是有序的,所以它可以通过下标指定获取的元素
②、List集合体系
ArrayList 底层使用数组
特点: 查询快,增删慢(数组有下标,所以查询快,数组增删会带动后续的元素移动,所以增删慢);线程不安全,效率高。
LinkedList 底层使用链表
特点: 查询慢,增删快(链表没有下标,查询从头开始一个个查找,所以慢,增删的话,只与前后两个元素有关,设置前后两个元素指向即可,所以增删快);线程不安全,效率高。
Vector 底层使用数组
特点: 查询快,增删慢;线程安全,效率低。
2. Set集合
①、定义
Set集合存取的元素是无序的,而且不允许存储重复的元素,当添加新元素时候,会先进行比较,若出现重复,则不添加,即添加失败。
②、应用场景
不需要集合中出现重复元素的时候,使用Set集合。
去重的时候,使用Set集合。
③、Set集合体系
HashSet 底层使用哈希表。(无序,不重复)
不重复:依赖于存储元素的类里面的hashCode和equals方法。
LinkedHashSet 底层使用链表和哈希表 (有序,不重复)
有序:链表保证有序(存入顺序就是存储顺序)
不重复:哈希表保证不重复
TreeSet 底层使用红黑树 (有序,不重复)
有序不重复:根据存储类实现Comparable接口后实现的compareTo方法,或者使用比较器Comparator重写compare方法。
二、List集合体系下常用集合
1、ArrayList集合
①、定义
List接口的实现类 – 常用
底层采用数组作为基础结构存储数据
②、初始容量以及扩容机制
无参构造的时候,默认的初始容量为10
有参构造的时候,参数就是指定的长度
当第一次向集合中添加元素的时候,容量设置为10,不是第一次后,当最小所需长度大于当前数组的长度,执行扩容,新容量为旧容量*1.5倍 + 1,再将新容量和最小所需容量比较获取最大值,再将值与最大容量比较,若大于最大容量则返回Integer的最大值,否则为使用当前容量进行扩容。
③、简单使用
// 无参构造 默认初始容量10
ArrayList list = new ArrayList();
// 有参构造 确定初始容量16
ArrayList list1 = new ArrayList(16);
// 添加新的元素
list.add("甘蔗");
list.add("甜菜");
list.add("甜杆");
// 获取集合长度
System.out.println(list.size());
// 向指定位置添加新的元素
list.add(0,"泡芙");
list.add(2,"蛋挞");
// 修改指定位置元素
list.set(1,"卷饼");
// 删除集合中指定的元素
boolean remove = list.remove("甘蔗"); //false
// 特定的删除
Object remove1 = list.remove(0); // 泡芙
// 遍历的方法
// 1. 普通的for循环
System.out.println("for循环:");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
// 卷饼 蛋挞 甜菜 甜杆
}
// 2. 使用forEach循环(增强for循环)
System.out.println("forEach()循环:");
for (Object o1 : list) {
System.out.println(o1);
// 卷饼 蛋挞 甜菜 甜杆
}
// 3. 使用迭代器
System.out.println("迭代器:");
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());