数据结构(Java):顺序表&集合类ArrayList

目录

1、线性表

2、顺序表

3、集合类ArrayList

3.1 ArrayList的成员变量

3.2 ArrayList的构造方法

3.2.1 带参构造之public ArrayList(int initialCapacity)

3.2.2 无参构造之public ArrayList()

3.2.1 带参构造之public ArrayList(Collection c)

3.3 ArrayList的扩容机制

3.4 ArrayList的常用方法

3.4.1 add方法(数据插入)

3.4.1.1 尾部插入数据

3.4.1.2 指定位置插入数据

3.4.2 addAll方法

3.4.3 remove方法(数据删除)

3.4.3.1 删除指定下标数据

3.4.3.2 删除确定数值的数据

3.4.4 get方法(获取数据)

3.4.5 set方法(修改数据)

3.4.6 clear方法(清空顺序表)

3.4.7 subList方法(截取顺序表)

3.5 ArrayList的遍历

3.5.1 for循环遍历

3.5.2 for each循环遍历

3.5.3 迭代器遍历

3.5.3.1 Iterator迭代器

3.5.3.2 ListIterator迭代器

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)

大家看到这个构造方法时,是不是愣住了一下子,哈哈哈~,不要慌张,听我道来。

我们先来看这个参数CollectionCollection是一个接口,不知道大家是否还有印象,它曾出现在集合框架中的顶层:

而<>中的内容,"?"是指通配符(这里了解即可),extends我们在讲解泛型时就已经知道,这规定了通配符的上界为E。

也就是说,该构造方法所传参数必须满足以下几点:

  1. 实现了Collection接口
  2. 所具备的泛型必须是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]
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值