1.什么是List
在集合框架中,list是一个接口,继承自collection。
collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示:
lterable也是一个接口,表示实现该接口的类是可以逐个元素进行遍历。
在数据结构的角度来看,list就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作。
2.list的使用
注意:List是个接口,并不能直接进行实例化。如果要使用,必须去实例化List的实现类。在集合框架中,ArrayList和LinkedList都实现了List接口。
3.ArrayList与顺序表
3.1线性表
常见的线性表:顺序表、链表、栈、队列......
线性表只是逻辑上的线型结构,但是在物理结构上并不一定是连续的,在存储时通常以数组和链式结构的形式存储。
顺序表:
链表:
3.2 ArrayList简介
ArrayList是以泛型方式实现的,使用时需要实例化;同时ArrayList 实现了RandomAccess 接口、Cloneable接口、Serializable接口 表明ArrayList支持随机访问,可以clone,支持序列化。但是,
ArrayList 在单线程下可以使用,在多线程中可以选择Vector,同时ArrayList可以动态扩容。
3.2.1 ArrayList常见操作
3.2.2 ArrayList遍历
3.2.3 ArrayList扩容
ArrayList是一个动态类型的顺序表,即在插入元素时会自动扩容,同时内部扩容分为几部:
1.检测是否真正需要扩容,如果调用grow准备扩容
2.预估需要扩容的大小
- 初步预定按照1.5倍大小扩容
- 如果需求超过1.5倍大小,则按照用户所需大小进行扩容
- 真正扩容之前检测是否能扩容成功,防止太大扩容失败
3.使用copyOf进行扩容
4.ArrayList的具体使用
4.1杨辉三角
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List <Integer>> arrayList=new ArrayList<>();
List<Integer> one=new ArrayList<>();
one.add(1);
arrayList.add(one);
for(int i=1;i<numRows;i++){
List<Integer>cur=new ArrayList<>();
cur.add(1);
List<Integer>pre=arrayList.get(i-1);
for(int j=1;j<i;j++){
int ret=pre.get(j-1)+pre.get(j);
cur.add(ret);
}
cur.add(1);
arrayList.add(cur);
}
return arrayList;
}
}