我们先来想一想什么是线性表?
线性表是最基本、最简单、也是最常用的一种数据结构。线性表(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);
}
运行结果:
以上就是本次全部内容,如果哪里写的有问题,还希望各位看官指正。