6.List系列集合
一、List集合特点、特有API
List系列集合特点
● ArrayList、LinkedList:有序、可重复、有索引
● 有序:存储和取出的元素顺序一致
● 有索引:可以通过索引操作元素
● 可重复:存储的元素可以重复
List的实现类的底层原理
ArrayList底层基于数组实现:根据索引定位元素快,增删相对慢。
LinkedList底层基于双链表实现:查询元素慢,增删首尾元素是非常快的。
LIst集合特有方法
List集合因为支持索引,所以多了很多索引操作的独特API,其他Collection的功能List也都继承了。
方法名称 | 说明 |
void add(int index, E element) | 在此集合中的指定位置插入指定的元素 |
E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
E set(int index, E element) | 修改指定索引的元素,返回被修改的元素 |
E get(int index) | 返回指定索引处的元素 |
【代码示例1】创建一个ArrayList集合对象 add(int index, E element)
public class ListDemo01 {
public static void main(String[] args){
// 1.创建一个ArrayList集合对象
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Java");
list.add("MySQL");
list.add("MySQL");
System.out.println(list);
}
}
运行结果:
[Java, Java, MySQL, MySQL]
【代码示例2】在某个索引位置插入元素 set(int index, E element)
// 2.在某个索引位置插入元素
list.add(2,"HTML");
System.out.println(list);
运行结果:
[Java, Java, HTML, MySQL, MySQL]
【代码示例3】根据索引删除元素,返回被删除的元素
// 3.根据索引删除元素,返回被删除的元素
System.out.println(list.remove(2));
System.out.println(list);
运行结果:
HTML
[Java, Java, MySQL, MySQL]
【代码示例4】根据索引获取元素
System.out.println(list.get(2)); // MySQL
【代码示例5】修改索引位置的元素
// 5.修改索引位置的元素
list.set(1,"高斯林");
System.out.println(list);
运行结果:
[Java, 高斯林, MySQL, MySQL]
【示例代码6】清空
list.clear(); //[]
二、List集合的遍历方式小结
List集合的遍历方式有几种?
① 迭代器
② 增强for循环
③ Lambda表达式
④ For循环(因为List集合存在索引)
【代码示例】
public class ListDemo02 {
public static void main(String[] args){
List<String> lists = new ArrayList<>();
lists.add("java1");
lists.add("java2");
lists.add("java3");
System.out.println(lists);
// 1.for循环
System.out.println("---------------------------");
for(int i=0; i<lists.size(); i++){
String ele = lists.get(i);
System.out.print(ele + " ");
}
// 2.迭代器
System.out.println("\n---------------------------");
Iterator<String> it = lists.iterator();
while(it.hasNext()){
String ele = it.next();
System.out.print(ele + " ");
}
// 3.foreach
System.out.println("\n---------------------------");
for(String ele : lists){
System.out.print(ele + " ");
}
// 4.JDK 1.8开始之后的Lambda表达式
System.out.println("\n---------------------------");
lists.forEach(s -> {
System.out.print(s + " ");
});
}
}
运行结果:
[java1, java2, java3]
---------------------------
java1 java2 java3
---------------------------
java1 java2 java3
---------------------------
java1 java2 java3
---------------------------
java1 java2 java3
三、ArrayList集合的底层原理
ArrayList集合底层原理
第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组。
List<String> list = new ArrayList<>();
list.add("a");
四、LinkedList集合的底层原理
LinkedList的特点
底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首位操作的API。
LinkedList集合的特有功能
方法名称 | 说明 |
public void addFirst (E e) | 在该列表开头插入指定的元素 |
public void addLast (E e) | 将指定的元素追加到此列表的末尾 |
public E getFirst ( ) | 返回此列表中的第一个元素 |
public E getLast ( ) | 返回此列表中的最后一个元素 |
public E removeFirst ( ) | 从此列表中删除并返回第一个元素 |
public E removeLast ( ) | 从此列表中删除并返回最后一个元素 |
LinkedList可以完成队列结构,和栈结构(双链表)
【代码示例1】栈
public class ListDemo03 {
public static void main(String[] args) {
// 栈
LinkedList<String> stack = new LinkedList<>();
// 压栈,入栈
stack.addFirst("第1颗子弹");
stack.addFirst("第2颗子弹");
stack.addFirst("第3颗子弹");
stack.addFirst("第4颗子弹");
System.out.println(stack);
// 出栈,弹栈
System.out.println("---------------------");
System.out.println(stack.getFirst()); // 第4颗子弹
System.out.println(stack);
System.out.println("---------------------");
System.out.println(stack.removeFirst());
System.out.println(stack.removeFirst());
System.out.println(stack.removeFirst());
System.out.println(stack);
}
}
运行结果:
[第4颗子弹, 第3颗子弹, 第2颗子弹, 第1颗子弹]
---------------------
第4颗子弹
[第4颗子弹, 第3颗子弹, 第2颗子弹, 第1颗子弹]
---------------------
第4颗子弹
第3颗子弹
第2颗子弹
[第1颗子弹]
【代码示例2】队列
public class ListDemo03 {
public static void main(String[] args) {
// 队列
LinkedList<String> queue = new LinkedList<>();
// 入队
queue.addLast("1号");
queue.addLast("2号");
queue.addLast("3号");
queue.addLast("4号");
System.out.println(queue);
// 出队
System.out.println("---------------------");
System.out.println(queue.getFirst());
System.out.println(queue);
System.out.println("---------------------");
System.out.println(queue.removeFirst());
System.out.println(queue.removeFirst());
System.out.println(queue.removeFirst());
System.out.println(queue);
}
}
运行结果:
[1号, 2号, 3号, 4号]
---------------------
1号
[1号, 2号, 3号, 4号]
---------------------
1号
2号
3号
[4号]