一、特点,特有方法
List集合:有序,可重复,有索引
ArrayList集合:有序,可重复,有索引
LinkedList集合:有序,可重复,有索引
ArrayList集合和LinkedList集合底层采用的数据结构(存储,组织数据的方式)不同,应用场景不同
List集合的特有方法
List集合因为支持索引所以多了很多与索引相关的方法,当然,Collection的功能List也都继承了
|-------------------------------|---------------------|
| 方法名称 | 说明 |
| void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
| E remove (int index) | 删除指定索引处的元素,返回被删除的元素 |
| E set (int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
| E get(int index) | 返回指定索引处的元素 |
import java.util.ArrayList;
import java.util.List;
public class ConList {
public static void main(String[] args) {
//1、void add(int index,E element) 在此集合中的指定位置插入指定的元素
List<String>list=new ArrayList<>();
list.add("宋钟基");
list.add("胡歌");
list.add("杨幂");
System.out.println(list);
list.add(3,"张国荣");
list.add(0,"陈建斌");
list.add(1,"宋雨琦");
list.add(2,"董卿");
System.out.println(list);
//2、E remove (int index) 删除指定索引处的元素,返回被删除的元素
list.remove(1);
System.out.println(list);
//3、E set (int index,E element) 修改指定索引处的元素,返回被修改的元素
System.out.println(list.set(3, "董宇辉"));
//4、E get(int index) 返回指定索引处的元素
System.out.println(list.get(1));
}
}
二、遍历方式
List集合支持的遍历方式
① for循环(因为List集合有索引)
②迭代器
③增强for循环
④Lambda表达式
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;
public class ListBianli {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("花千骨");
list.add("糖宝");
list.add("风轻水");
System.out.println(list);
//① for循环(因为List集合有索引)
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//②迭代器
Iterator <String> iterator=list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
//③增强for循环
for (String s : list) {
System.out.println(s);
}
//④Lambda表达式
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
list.forEach( s-> { System.out.println(s); });
}
}
三、ArrayList集合的底层原理
基于数组实现的
数组的特点:查询快,增删慢
查询速度快(注意:是根据索引查询速度快):查询数据通过索引值和地址值定位,查询任意索引耗时相同
删除效率低:可能需要把后面的很多的数据进行迁移
添加效率极低:可能需要把后面很多的数据后移,再添加元素,或者也可能需要进行数组的扩容
1、ArrayList集合的底层原理
①利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组
②添加一个元素时底层会创建一个新的长度为10的数组
③存满时,会扩容1.5倍
④如果一次添加多个元素,1.5倍还放不下,则新创建的数组的长度以实际为准
特点:查询快,增删慢
ArrayList集合适合的应用场景
1、ArrayList适合:根据索引查询数据,比如根据随机索引取数据(高效)!或者数据量不是很大时。
2、ArrayList不适合:数据量大的同时,又要频繁的进行增删操作。
LinkedList集合的底层原理
*基于双链表实现的
*特点:查询慢,增删相对快,但对首尾元素的元素进行增删改查的速度是极快的
1、什么是链表?有啥特点?
链表中的节点是独立的对象,在内存中是不连续的,每个节点包含数据值和下一个节点的地址。
链表的特点:①查询慢,无论查询哪个数据,都要从头开始找②链表增删相对快
单向列表:只能从头节点往后找
双向列表:既可以从头节点往后找,也可以从尾节点往前找。
特点:查询慢,增删相对快,但对首尾元素的元素进行增删改查的速度是极快的
LinkedList新增了:很多首尾操作的特有方法
|---------------------------|------------------|
| 方法名称 | 说明 |
| public void addFirst(E e) | 在该列表开头插入指定的元素 |
| public void addList(E e) | 将指定的元素追加到此列表的首尾 |
| public E getFirst() | 返回此列表中的第一个元素 |
| public E getLast() | 返回此列表中的最后一个元素 |
| public E removeFirst() | 从此列表中删除并返回第一个元素 |
| public E removeLast() | 从此列表中删除并返回最后一个元素 |
LinkedList的应用场景之一:可以用来设计对列
队列的特点:先进先出,后进后出。
只是在首尾增删元素,用LinkedList来实现很合适。
LinkedList的应用场景之二:可以用来设计栈
栈的特点:后进先出,先进后出
数据进入栈模型的过程称为:压/进栈(push)
数据离开栈模型的过程称为:弹/出战(pop)
栈顶元素先出,栈底元素后出
只是首部增删元素,用LinkedList来实现很合适
import java.util.LinkedList;
public class ListTest {
public static void main(String[] args) {
//1、创建一个队列
LinkedList<String> queue=new LinkedList<>();
queue.addFirst("第一个");
queue.addFirst("第二个");
queue.addFirst("第三个");
queue.addFirst("第四个");
System.out.println(queue);
//出队
System.out.println(queue.removeFirst());
System.out.println(queue.removeFirst());
//创建一个栈对象
LinkedList<String> stack=new LinkedList<>();
stack.addFirst("第一个");
stack.addFirst("第二个");
stack.addFirst("第三个");
stack.addFirst("第四个");
System.out.println(stack);
System.out.println(stack.removeFirst());
}
}