线性表:
线性表是一个由n个具有相同特性的数据元素构成的有限序列。常用到的线性表都有:链表、队列、栈、顺序表....
顺序表:
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构(顺序表的元素类型是包装类,一般数组是基本数据类型)
按ctrl+鼠标左键我们可以看到List只是一个接口,而Arraylist是一个实现List接口的类,在用之前要先导包(导包其实idea会在我们用到List接口的时候自动帮我们导包,我们可以直接用)
由于List只是一个接口,所以只能通过实例化去调用,在包里有很多的已经封装好的API可以给我们使用,通过实例化后就可以进行访问
因为list接口的元素数据类型是泛类,所以我们要用对应数据类型的包装类作为元素的数据类型,要避免省略类型,不然任何类型的元素都能放进表里,用起来就很麻烦
Arraylist的构造:
//静态初始化,建一个空表
List <T> name = new ArrayList<>();
动态初始化顺序表:指定顺序表的容量
//动态初始化,建一个空间大小为12的顺序表
List <Character> list2 = new ArrayList<>(12);
Arraylist的扩容机制:
Arraylist是个动态顺序表,在插入元素的时候会自动进行扩容
提问:这段代码有无缺陷?
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add(i);
}
}
有!这个疑问就得必须去看ArrayList原有接口中的类是怎么写的方法。
我们可以看到原有的类中给定的Arraylist默认空间大小为10
而扩容的方法是grow(),我们看一下方法grow()具体是怎么写的
扩容机制中默认将原有的空间大小扩大为原来的1.5倍,如果需要的扩容空间超过1.5倍则按需求扩容。
总结:1.需要扩容的话就调用grow()进行扩容。
2.初步预估扩容大小为原有的1.5倍,在进行扩容前先预计需要扩容的空间大小,按需求进行扩容避免空间过大而扩容失败。
3.用Copyof()进行扩容。