目录
3.2.1 带参构造之public ArrayList(int initialCapacity)
3.2.1 带参构造之public ArrayList(Collection c)
3.5.3.3 Iterator迭代器和ListIterator迭代器的关系
3.5.3.3.1 ListIterator迭代器的新增功能
1、线性表
线性表,在逻辑结构上是连续的(可理解为连续的一条直线,一对一的关系),而在物理结构上不一定连续,通常以数组和链式结构进行存储。
线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表、链表、栈、队列......
2、顺序表
顺序表是线性表的一种,其物理地址是连续的,并采用数组的存储结构,在数组上完成数据的增删查改。
3、集合类ArrayList
在Java集合框架中,ArrayList是一个泛型类,并且实现了List接口,是Java为我们封装好的顺序表。
当我们想存储哪种类型的元素时,都可以通过泛型传参来构建相应类型的顺序表。
接下来,让我为大家仔细讲解一下ArrayList这个集合类。
3.1 ArrayList的成员变量
我们通过观察ArrayList的源码,得到其成员变量如下:
已知,DEFAULT_CAPACITY是指默认容量(10),elementData是用来实际存储数据的数组,size记录顺序表数据的数量,剩下的两个数组均为空数组。
想要知道他们的用途,我们还需要观察ArrayList的构造方法。
3.2 ArrayList的构造方法
通过观察源码,我们依然可以得出其构造方法:
接下来,我们逐个分析。
3.2.1 带参构造之public ArrayList(int initialCapacity)
不难看出,我们传入的参数就是我们初始化顺序表时的容量(即大小)。
通过if-else语句可以看出:
1.传入的参数为正数时,初始化的大小即为参数值。
2.传入的参数为0时,该顺序表数组的引用指向的就是成员变量中的空数组。
3.传入的参数为负数时,则会抛出异常(数组大小肯定为正数)。
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>(10);//初始容量为10
}
3.2.2 无参构造之public ArrayList()
这个构造方法就更简单了,无参构造时,该顺序表数组的引用指向的也是成员变量中的空数组。
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
}
3.2.1 带参构造之public ArrayList(Collection<? extends E> c)
大家看到这个构造方法时,是不是愣住了一下子,哈哈哈~,不要慌张,听我道来。
我们先来看这个参数Collection,Collection是一个接口,不知道大家是否还有印象,它曾出现在集合框架中的顶层:
而<>中的内容,"?"是指通配符(这里了解即可),extends我们在讲解泛型时就已经知道,这规定了通配符的上界为E。
也就是说,该构造方法所传参数必须满足以下几点:
- 实现了Collection接口
- 所具备的泛型必须是E或者E的子类
也就是说,我们也可以将另一个集合当做参数传入。
代码示例:
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
ArrayList<Integer> list1 = new ArrayList<>(list);//将list当做顺序表构造方法的参数传入
list1.add(99);
list1.add(100);
System.out.println(list1);//[1, 2, 3, 99, 100]
}