List系列集合
Collection集合体系
1. List集合特点、特有API
1.1 List系列集合特点
- ArrayList、LinekdList :有序,可重复,有索引。
- 有序:存储和取出的元素顺序一致
- 有索引:可以通过索引操作元素
- 可重复:存储的元素可以重复
1.2 List集合特有方法
List集合因为支持索引,所以多了很多索引操作的独特api,其他Collection的功能List也都继承了。
1.创建一个ArrayLIst集合对象
List<String> list = new ArrayList<>();
list.add("Java");
list.add("JavaWeb");
list.add("HTML");
list.add("CSS");
list.add("JS");
System.out.println(list);
- 在某个索引位置插入元素
// 2. 在某个索引位置插入元素
list.add(2 , "java");
System.out.println(list);
- 根据索引删除元素 , 返回被删除的元素
// 3. 根据索引删除元素 , 返回被删除的元素
System.out.println(list.remove(2));
System.out.println(list);
- 根据索引获取元素:
// 4. 根据索引获取元素:
System.out.println(list.get(2));
- 修改索引位置处的元素
// 5. 修改索引位置处的元素
// 返回修改的数据
System.out.println(list.set(1 , "徐凤年"));
System.out.println(list);
1.3 结果显示
1.4 List的实现类的底层原理
ArrayList底层是基于数组实现的,根据查询元素快,增删相对慢。
LinkedList底层基于双链表实现的,查询元素慢,增删首尾元素是非常快的。
2. List集合的遍历方式小结
2.1 List集合的遍历方式
2.2 迭代器
1.创建一个ArrayLIst集合对象
List<String> list = new ArrayList<>();
list.add("java");
list.add("javaWeb");
list.add("HTML");
list.add("CSS");
list.add("JS");
System.out.println(list);
迭代器遍历删除错误显示
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String ele = iterator.next();
if ("java".equals(ele)) {
list.remove("java");
}
}
System.out.println(list);
使用这种形式会出现错误
正确写法
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String ele = iterator.next();
if ("java".equals(ele)) {
iterator.remove();
}
}
System.out.println(list);
2.3 foreach遍历删除
使用foreach遍历删除会出现错误
2.4 lambda表达式
使用lambda遍历删除会出现错误
2.5 for循环
for循环(不会出现异常错误 , 但是数据删除出现了问题 , 会漏掉元素)
// for循环(不会出现异常错误 , 但是数据删除出现了问题 , 会漏掉元素)
for (int i = 0 ; i < list.size() ; i++) {
String s = list.get(i);
if ("javaWeb".equals(s)) {
list.remove("javaWeb");
}
}
System.out.println(list);
解决方法1 : 从末尾开始遍历删除
代码演示
// 解决方案
for (int i = list.size() - 1 ; i >= 0 ; i--) {
String s = list.get(i);
if ("javaWeb".equals(s)) {
list.remove("javaWeb");
}
}
System.out.println(list);
解决方法2 : 在 list.remove(“javaWeb”); 执行后添加 i–
代码演示
// 解决方案2
for (int i = 0 ; i < list.size() ; i++) {
String s = list.get(i);
if ("javaWeb".equals(s)) {
list.remove("javaWeb");
i--;
}
}
System.out.println(list);
3. ArrayList集合的底层原理
3.1 Collection集合体系
3.2 ArrayList集合底层原理
ArrayList底层是基于数组实现的:根据索引定位元素快,增删需要做元素的移位操作。
第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组。
3.3 List集合存储的元素要超过容量怎么办?
4. LinkedList集合的底层原理
4.1 LinkedList的特点
底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API。
4.2 LinkedList集合的特有功能
LinkedList可以完成队列结构 , 和栈结构(双链)
栈
LinkedList<String> stack = new LinkedList<>();
压栈 , 入栈
// 压栈 , 入栈
stack.push("第一个子弹");
stack.push("第二个子弹");
stack.push("第三个子弹");
stack.push("第四个子弹");
System.out.println(stack);
出栈
// 出栈
System.out.println(stack.removeFirst());
System.out.println(stack.removeFirst());
System.out.println(stack.removeFirst());
System.out.println(stack);
队列
// 队列
LinkedList<String> queue = new LinkedList<>();
入列
// 入列
queue.addLast("1号");
queue.addLast("2号");
queue.addLast("3号");
queue.addLast("4号");
System.out.println(queue);
出列
// 出列
System.out.println(queue.removeFirst());
System.out.println(queue.removeFirst());
System.out.println(queue.removeFirst());
System.out.println(queue);
4.3 结果显示
4.4 链表的种类
5. 补充知识:集合的并发修改异常问题
5.1 问题引出
当我们从集合中找出某个元素并删除的时候可能出现一种并发修改异常问题。
5.2 哪些遍历存在问题?
迭代器遍历集合且直接用集合删除元素的时候可能出现。
增强for循环遍历集合且直接用集合删除元素的时候可能出现。
5.3 哪种遍历且删除元素不出问题
迭代器遍历集合但是用迭代器自己的删除方法操作可以解决。
使用for循环遍历并删除元素不会存在这个问题。
5. 补充知识:集合的并发修改异常问题
[外链图片转存中…(img-yMcPl0py-1667719102755)]
5.1 问题引出
当我们从集合中找出某个元素并删除的时候可能出现一种并发修改异常问题。
5.2 哪些遍历存在问题?
迭代器遍历集合且直接用集合删除元素的时候可能出现。
增强for循环遍历集合且直接用集合删除元素的时候可能出现。
5.3 哪种遍历且删除元素不出问题
迭代器遍历集合但是用迭代器自己的删除方法操作可以解决。
使用for循环遍历并删除元素不会存在这个问题。