线性表
线性表(linear list)是n个具有相同特性的数据元素的的有限序列。线性表是一种在实际中广泛使用的数据结构,线性表用于存储逻辑关系为“一对一”的数据,常见的线性表有:顺序表、链表、栈、队列、字符串……
只有线性结构有次序的概念,从而有第一个元素和最后一个元素的概念和有下标的概念。
线性结构特点:
- 元素和元素之间有前后关系
- 元素会有在第几个位置的概念,位置通过下标(index)表示,从 0 开始
- 插入可以根据位置的不同,分为:头插、尾插、按位置插入
- 删除可以根据位置的不同,分为:头删、尾删、按位置删除
- 遍历可以分为从前往后遍历和从后往前遍历
- Java 中,List 是一个接口,并且是 Collection 的子接口
- 线性表不允许中间有空洞,也就是说,线性表中在逻辑上必须连续
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时通常以数组和链式结构的形式存储。
注意:顺序表中一定区分两个概念:容量(capacity) 和 元素个数(size);线性表中的所有下标只和元素个数相关,和容量无关。
顺序表:逻辑上线性,在内存中存储时,也严格暗示找逻辑上的次序保存起来。
链表:只要求逻辑上线性,在内存中存储时,可以不用保证连续性。
顺序表
存在的原因:
数组是一种“不是非常完备的”线性表。数组具有下面的缺点。
1,数组无法严格区分容量和已有的元素长度。
2,数组无法做到自行扩容。
3,数组无法明确得到其中有多少个有效元素。
顺序表在逻辑上线性,在内存中存储时也严格按照逻辑上的次序保存。
顺序表是在计算机内存中以数组的形式保存的线性表,顺序表是一个泛型类,其元素类型用泛型表示。
顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
//整形顺序表的定义
ArrayList<Integer> list = new ArrayList<>();
是由顺序表存储元素不需要考虑容量问题,只需要考虑保存的元素个数。顺序表不会出现null的情况。
顺序表最重要的是它的增删查改操作。
顺序表增删查改 相关方法
Java顺序表常用的增删查改操作有:
增(add)
boolean add(元素类型 e);
void add(int index, 元素类型 e);
删(remove)
元素类型 remove(int index);
boolean remove(元素类型 e);
查(get)
元素类型 get(int index);
改(set)
元素类型 set(int index, 元素类型 e);
还有其他关于顺序表的操作如下:
package java.util;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.ListIterator;
/**
* 线性结构
* 特点:
* 1. 元素和元素之间有前后关系
* 2. 元素会有在第几个位置的概念,位置通过下标(index)表示,从 0 开始
* 3. 插入可以根据位置的不同,分为:头插、尾插、按位置插入
* 4. 删除可以根据位置的不同,分为:头删、尾删、按位置删除
* 5. 遍历可以分为从前往后遍历和从后往前遍历
* 6. Java 中,List 是一个接口,并且是 Collection 的子接口
*/
public interface List extends Collection {
/**
* 将 e 尾插到线性表中
* @参数 e 待插入的元素
* @返回值 一定是 true,表示插入成功。线性表是不会出现插入不成功的情况的
*/
boolean add(元素类型 e);
/**
* 将 e 插入到线性表的 index 位置处;要求原来 index 及之后的元素全部向后移动
* index 的可选范围是 0 <= index <= size()
* @参数 index 插入位置(下标)
* @参数 待插入的元素
*/
void add(int index, 元素类型 e);
/**
* 删除 index 位置的元素,并返回该元素;要求 原来 index + 1 及之后元素全部向前移
动
* index 的可选范围是 0 <= index < size()
* @参数 index 待删除位置(下标)
* @返回值 被删除掉的元素
*/
元素类型 remove(int index);
/**
* 删除从前往后遍历时,遇到的第一个相等的(equals)元素
* @参数 待删除元素
* @返回值 true:删除成功; false:没有找到相等的元素
*/
boolean remove(元素类型 e);
/**
* 返回 index 位置的元素
* index 的可选范围是 0 <= index < size()
* @参数 index 获取元素的位置(下标)
* @返回值 获取到的元素
*/
元素类型 get(int index);
/**
* 用新的元素 e 替换 index 位置的元素,并返回 index 位置的原来的元素
* index 的可选范围是 0 <= index < size()
* @参数 index 待替换元素的位置(下标)
* * @参数 e 要替换的新元素
* @返回值 index 位置的老元素
*/
元素类型 set(int index, 元素类型 e);
/**
* 通过遍历的方式,判断与元素 e 相等(equals)的元素是否存在于线性表中
* @参数 e 待查找元素
* @返回 true:包含;false:不包含
*/
boolean contains(元素类型 e);
/**
* 按照从前往后遍历的方式,找到第一个与元素 e 相等(equals)的元素的下标
* @param e 待查找元素
* @return >= 0 表示找到并且返回下标;-1 代表没有找到
*/
int indexOf(元素类型 e);
/**
* 按照从后往前遍历的方式,找到第一个与元素 e 相等(equals)的元素的下标
* @param e 待查找元素
* @return >= 0 表示找到并且返回下标;-1 代表没有找到
*/
int lastIndexOf(元素类型 e);
/**
* 清空线性表,也就是,调用 clear() 后,线性表的 size() == 0;isEmpty() ==
true
*/
void clear();
/**
* 返回线性表中已有元素的个数
* @return 返回元数个数
*/
int size();
/**
* 返回线性表是不是一个空的容器
* @return true 为空容器
*/
boolean isEmpty();
/ 以下的使用频率略低
Iterator iterator();
void sort(Comparator 比较器);
List subList(int fromIndex, int toIndex);
/ 以下的方法,了解即可
boolean addAll(Collection 集合);
boolean addAll(int index, Collection 集合);
boolean containsAll(Collection 集合);
boolean removeAll(Collection 集合);
boolean retainAll(Collection 集合);
Object[] toArray();
}