java线性表
线性表
线性表是一种经典的数据结构,它遵循线性逻辑结构的特点。
在Java中,线性表主要通过ArrayList和LinkedList来实现。
1.特点:
-
数据元素之间具有“一对一”的逻辑关系
-
第一个数据元素没有前驱,这个数据元素被称为头结点
-
最后一个数据元素没有后继,这个数据元素被称为尾节点
-
除了第一个数据元素和最后一个数据元素外,其余的数据元素有且仅有唯一前驱和后继
前驱元素:若元素A在B元素的前面,则A为B的前驱元素 后继元素:若元素B在元素A的后面,则B为A的后继元素
2.ArrayList:
-
ArrayList是Java中实现线性表的一种方式,采用顺序存储结构。
-
优点:访问速度快,支持动态扩展。
-
缺点:插入和删除操作相对较慢。
应用场景:适用于查找和访问操作较频繁的场景,如统计数据、存储用户信息等。
3.LinkedList:
-
LinkedList是Java中实现线性表的另一种方式,采用链式存储结构。
-
优点:插入和删除操作快,支持动态扩展。
-
缺点:访问速度相对较慢。
应用场景:适用于插入和删除操作较频繁的场景,如队列、栈等。
4.线性表的分类
线性表中的数据存储的方式可以是顺序存储,也可以是链式存储
按照数据的存储方式的不同,可以把线性表分为:
- 顺序表
- 链表
5.线性表的应用:
-
排序:线性表可以用于实现各种排序算法,如冒泡排序、快速排序等。
-
查找:线性表可以用于实现查找算法,如顺序查找、二分查找等。
-
队列:线性表可以用于实现队列数据结构,遵循“先进先出”(FIFO)的原则。
-
栈:线性表可以用于实现栈数据结构,遵循“后进先出”(LIFO)的原则。
1.1 顺序表
顺序表的特点是元素在内存中是连续存储的,可以通过索引进行快速的访问。
在 Java 中,顺序表是一种线性表的实现方式,它通过使用数组来存储元素,并按照元素在数组中的位置来建立元素之间的逻辑关系。
在 Java 中,常用的顺序表实现方式是使用 ArrayList 类。ArrayList 是 Java 集合框架中的一员,它实现了动态数组,可以在运行时自动调整大小。以下是对顺序表在 Java 中的使用和特点的详细讲解:
1.1.1 创建顺序表
可以通过实例化 ArrayList 类来创建一个顺序表。例如:
ArrayList<String> list = new ArrayList<>();
在这个例子中,我们创建了一个名为 `list` 的顺序表,其中存储的元素类型是 String。
1.1.2. 添加元素
可以使用 add
方法向顺序表中添加元素。例如:
list.add("element1");
list.add("element2");
在上述代码中,我们向顺序表 `list` 中添加了两个元素。
1.1.3. 访问元素
顺序表中的元素可以通过索引来访问。索引从0开始,表示第一个元素。例如:
String element = list.get(0);
这个例子中,我们使用 `get` 方法来获取顺序表 `list` 中索引为 0 的元素。
1.1.4. 删除元素
可以使用 remove
方法删除顺序表中的元素。例如:
list.remove(0);
这个例子中,我们删除了顺序表 `list` 中索引为 0 的元素。
1.1.5. 修改元素
通过索引可以修改顺序表中的元素。例如:
list.set(0, "newElement");
这个例子中,我们将顺序表 `list` 中索引为 0 的元素修改为 "newElement"。
1.1.6. 其他常用操作
-
获取顺序表的大小:可以使用
size
方法来获取顺序表中元素的个数。 -
遍历顺序表:可以使用循环结构(如 for-each 循环)来遍历顺序表中的所有元素。
-
判断顺序表是否为空:可以使用
isEmpty
方法来判断顺序表是否为空。
import java.util.Arrays;
class ArrayList {
private int size;
private int[] elements;
private static final int DEFAULT_CAPACITY = 10;
public ArrayList() {
this.elements = new int[DEFAULT_CAPACITY];
this.size = 0;
}
// 在尾部插入元素
public void add(int value) {
ensureCapacity(size + 1);
elements[size++] = value;
}
// 在指定位置插入元素
public void add(int index, int value) {
ensureCapacity(size + 1);
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
System.arraycopy(elements, index, elements, index + 1, size - index);
elements[index] = value;
size++;
}
// 获取指定位置的元素
public int get(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
return elements[index];
}
// 修改指定位置的元素
public void set(int index, int value) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
elements[index] = value;
}
// 删除指定位置的元素
public void remove(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException(