(二十四)List系列集合
目录
前言:
一、List集合的特有方法
二、List集合的遍历方式有几种?
三、Arraylist集合底层原理
四、LinkedList的特点
前言:
List集合包括JavaList接口以及List接口的所有实现类。List集合中的元素允许重复,各元素的顺序放是对象插入的顺序,类似Java中的数组,用户可通过使用索引(元素在集合中的位置)来访问集合中的元素。
List的最重要的特征就是有序;它会确保以一定的顺序保存元素。List在Collection的基础上添加了大量方法,使之能在序列中间插入和删除元素。(只对LinkedList推荐使用。)
List可以制造ListIterator对象,你除了能用它在List的中间插入和删除元素之外,还能用它沿两个方向遍历List。
一、List集合的特有方法
List集合因为支持索引,所以多了很多索引操作的独特API,其他Collection的功能List也都继承了。
2.代码演示:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**List
* Arraylist Linkedlist 有序、可重复、有索引
* LinkList :API
* addFirst(E,e) 在该列表开头插入指定的元素
* addLast(E,e) 将指定的元素追加到此列表的末尾
* getFirst() 返回此列表的第一个元素
* getLast() 返回此列表的最后一个元素
* removeFirst() 删除并返回第一个元素
* removeLast() 删除并返回最后一个元素
*/
/**集合并发修改异常问题
* 找出某些元素并修改时容易出并发修改异常问题
*/
public class List_Demo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("JAVA");
list.add("JAVA");
list.add("MYsql");
list.add("Python");
//在某个索引位置添加数据
list.add(2, "html");
System.out.println(list);
//根据索引删除元素
System.out.println(list.remove(2));
System.out.println(list);
//根据索引获取元素
System.out.println(list.get(2));
//修改索引位置的元素 ,返回修改前的数据
System.out.println(list.set(1, "Myprict"));
System.out.println(list);
}
}
3.List的实现类的底层原理
ArrayList底层是基于数组实现的,根据查询元素快,增删相对慢;
linkedList底层是基于双链表实现的,查询元素慢,增删首尾元素是非常快的。
二、List集合的遍历方式有几种?
①迭代器
②增强for循环
③Lambda表达式
④for循环(因为List集合存在索引)
4.代码演示:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListDemo2 {
public static void main(String[] args) {
List<String> lists = new ArrayList<>();
lists.add("JAVA");
lists.add("JAVA");
lists.add("MYsql");
lists.add("Python");
//1.for循环
System.out.println("--------------");
for (int i = 0; i < lists.size(); i++) {
String ele = lists.get(i);
System.out.println(ele);
}
//2.迭代器
System.out.println("--------------");
Iterator<String> it = lists.iterator();
while (it.hasNext()){
String ele = it.next();
System.out.println(ele);
}
//3.foreach
System.out.println("-----------");
for (String ele : lists) {
System.out.println(ele);
}
//4.Lambda表达式
System.out.println("--------------");
lists.forEach(s -> {
System.out.println(s);
});
}
}
三、Arraylist集合底层原理
Arraylist集合底层是基于数组实现的:根据索引定位元素快,增删需要做元素的移位操作。
第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组。
四、LinkedList的特点
底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API。
5.LinkedList集合的特有功能
6.代码演示:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**List
* Arraylist Linkedlist 有序、可重复、有索引
* LinkList :API
* addFirst(E,e) 在该列表开头插入指定的元素
* addLast(E,e) 将指定的元素追加到此列表的末尾
* getFirst() 返回此列表的第一个元素
* getLast() 返回此列表的最后一个元素
* removeFirst() 删除并返回第一个元素
* removeLast() 删除并返回最后一个元素
*/
/**集合并发修改异常问题
* 找出某些元素并修改时容易出并发修改异常问题
*/
public class List_Demo {
public static void main(String[] args) {
//LinkedList可以完成队列结构和栈结构(双链表)
//栈
LinkedList<String> stack = new LinkedList<>();
//入栈
stack.push("第一颗子弹");
stack.addFirst("第二颗子弹");
stack.addFirst("第三颗子弹");
stack.addFirst("第四颗子弹");
stack.addFirst("第五颗子弹");
stack.addFirst("第六颗子弹");
System.out.println(stack);
//出栈
System.out.println(stack.removeFirst());
System.out.println(stack.pop());
System.out.println(stack);
System.out.println("==================================");
//队列
LinkedList<String> queue = new LinkedList<>();
//入队
queue.offerLast("1号");
queue.addLast("2号");
queue.addLast("3号");
queue.addLast("4号");
queue.addLast("5号");
//出队
System.out.println(queue.removeFirst());
System.out.println(queue);
System.out.println("=============================");
//结合并发修改异常
//迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String ele = it.next();
if ("JAVA".equals(ele)) {
// list.remove("JAVA");//会报错
it.remove();//正确
}
}
System.out.println(list);
}
}