用Java描述数据结构之线性表的顺序存储(顺序表),ArrayList及其方法的介绍

我们先来想一想什么是线性表?

线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。

以上是百度百科中介绍的线性表,说白了线性表就是一个个数据元素逻辑上以一对一的相邻关系(但是在物理结构上并不一定是连续的)组织起来的的有限序列。

根据物理存储方式的不同可以将线性表分为两种,一种叫顺序表,一种叫链表,这篇博客主要介绍顺序表。

逻辑上相邻 ,实际在物理内存中存储的时候也相邻的一种结构,这种结构一个更具体的名称——顺序表。说到这里,很多同学会想到数组,数组其实是一种“不是非常完备”的顺序表,为什么这么说呢?第一个原因是因为数组无法严格区分容量(capacity)和已有元素个数(size),另一个原因是数组无法做到自行扩容
,这里举个例子来理解这两个原因:

public static void main(String[] args) {
        long[] array = new long[5];
        array[0] = 1;
        array[1] = 2;
    }

可以看到我们声明了一个名叫array的数组,数组中可以存放五个 long 类型的数据,没错我们是知道array可以存五个 long 类型数据,但是我们不知道array这个现在存放了几个数据,也正因为它的大小不能改变,导致了我们也不知道它还能存多少个数据。
Java中有一个泛型类——ArrayList 实现了顺序表,其实这个类底层还是用数组来存储数据,只不过ArrayList会通过检测当前数组元素个数和数组容量的关系,当元素个数达到一定量的时候会创建一个更大的新数组,将原来数组的元素全都复制到新的这组,同时ArrayList中有size()方法可以返回当前顺序表中元素的个数,这就解决了数组要作为顺序表存在的问题。
所以用Java编程时想要用好顺序表,就得掌握ArrayList的相关知识。


先建立一个数据类型为String的顺序表:

public static void main(String[] args) {
        //创建一个顺序表对象
        ArrayList<String> list = new ArrayList<>();
    }

ArrayList中的方法大致可以归为“增删查改”四个类型,下面分别介绍(下面介绍中的E都代表当前数据类型):

增 :

方法名作用
boolean add(element)将element尾插在顺序表中,因为顺序表理论上没有容量限制所以一定会尾插成功,即一定会返回true。
void add(index, element)将element插在指定位置index处,index的范围应该在[0, size()]之间。

删 :

方法名作用
E remove(index)删除index位置的元素,并返回该元素的值。
boolean remove(element)删除指定元素,这里就有三种情况了: 1.如果该元素确实在顺序表中,并且只有一个,则删除该元素,把后面所有元素依次补上来,最后返回true;2.如果该元素在顺序表中有多个,则删除第一个,同时把后面的所有元素补上来,同时返回true;3.如果顺序表中没有该元素,则什么都不做,返回false。
void clear()无论顺序表中原来有多少元素,执行该方法之后, 清空这个顺序表。

查 :

方法名作用
E get(index)获取顺序表中的index位置的元素,并且返回,index的范围为[0, size()]。
boolean contains(element)判断顺序表中是否包含元素,包含返回true,否则返回false。
int indexOf(element)返回该元素从前往后找的首次遇到的下标,如果没有则返回 -1。
int lastIndexOf(element)返回该元素从后往前找的首次遇到的下标,如果没有则返回 -1。
boolean isEmpty()判断顺序表是否为空,为空返回true,否则返回false。
int size()返回顺序表中元素的个数。

改 :

方法名作用
E set(index, element)向顺序表的index位置放入元素element,并且返回该下标位置原来的元素。

下面通过代码来更详细的介绍ArrayList:

    public static void main(String[] args) {
        //创建一个顺序表对象
        ArrayList<String> list = new ArrayList<>();
        System.out.println("========增========");
        //向顺序表尾插元素
        list.add("爱");
        list.add("中");
        System.out.println(list);
        //向顺序表指定位置插入元素
        list.add(0,"我");
        list.add(3,"国");
        System.out.println(list);
        System.out.println("========删========");
        //会返回被删除的元素
        System.out.println(list.remove(0));
        //顺序表中有元素 爱,被删除后返回true
        System.out.println(list.remove("爱"));
        System.out.println(list);
        list.clear();
        System.out.println(list);
        System.out.println("========查========");
        //先添几个元素
        list.add("我");
        list.add("爱");
        list.add("中");
        list.add("国");
        list.add("我");
        list.add("爱");
        list.add("家");
        list.add("乡");
        //获取index处的元素
        System.out.println(list.get(0));
        //查找顺序表中是否有元素 我,因为有所以返回true
        System.out.println(list.contains("我"));
        //从前往后查找元素
        list.indexOf("我");
        //从后往前查找元素
        list.lastIndexOf("我");
        //判断顺序表是否为空
        System.out.println(list.isEmpty());
        //顺序表size
        System.out.println(list.size());
        System.out.println("========改========");
        //向顺序表的index位置放入元素element,并且返回该下标位置原来的元素
        list.set(0,"你");
        System.out.println(list);
    }

运行结果:
在这里插入图片描述
以上就是本次全部内容,如果哪里写的有问题,还希望各位看官指正。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有裂痕的石头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值