1.线性表
线性表是n个具有相同特性的数据元素的有限序列。常见的有:顺序表,链表,栈,队列......
线性表在逻辑上一定是连续的,但是物理上并不一定连续,物理上通常以链表和数组的形式存储。
2.顺序表
顺序表在逻辑和物理上都是连续的。
2.1接口实现
接口内部原理和实现:
public class MyArraylist {
public int[] elem;
public int usedSize;//0
//默认容量
private static final int DEFAULT_SIZE = 10;
public MyArraylist() {
this.elem = new int[DEFAULT_SIZE];
}
/**
* 打印顺序表:
* 根据usedSize判断即可
*/
public void display() {
if (usedSize == 0) {
System.out.println("[]");//打印空数组
return;
}
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < usedSize; i++) {
sb.append(elem[i]+" ");
}
sb.append("]");
System.out.println(sb);
}
// 新增元素,默认在数组最后新增
public void add(int data) {
if (isFull()) {
grow();
}
//进行扩容操作
elem[usedSize] = data;
usedSize++;
}
public void grow() {
this.elem = Arrays.copyOf(this.elem, this.elem.length * 2);
}
/**
* 判断当前的顺序表是不是满的!
*
* @return true:满 false代表空
*/
public boolean isFull() {
if (usedSize == elem.length) {
return true;
}
return false;
}
private boolean checkPosInAdd(int pos) {
//判断传入位置是否合法
if (pos < 0 || pos > usedSize) {
throw new ArrayIndexOutOfBoundsException("数组下标越界");
}
return true;
}
// 在 pos 位置新增元素
public void add(int pos, int data) {
checkPosInAdd(pos);
if (isFull()) {
grow();
}
elem[usedSize] = data;
usedSize++;
}
// 判定是否包含某个元素
public boolean contains(int toFind) {
for (int i = 0; i < usedSize; i++) {
if (elem[i] == toFind) {
return true;
}
}
return false;
}
// 查找某个元素对应的位置
public int indexOf(int toFind) {
for (int i = 0; i < usedSize; i++) {
if (elem[i] == toFind) {
return i;
}
}
return -1;
}
// 获取 pos 位置的元素
public int get(int pos) {
checkPosInAdd(pos);
return elem[pos];
}
private boolean isEmpty() {
if (usedSize == 0) {
return true;
}
return false;
}
// 给 pos 位置的元素设为【更新为】 value
public void set(int pos, int value) {
checkPosInAdd(pos);
elem[pos] = value;
}
/**
* 删除第一次出现的关键字key
*
* @param key
*/
public void remove(int key) {
int num = indexOf(key);
for (int i = num; i < usedSize; i++) {
elem[num] = elem[num + 1];
}
usedSize--;
}
// 获取顺序表长度
public int size() {
return usedSize;
}
// 清空顺序表
public void clear() {
usedSize = 0;
}
}
2.2使用方法
boolean add(E e) 尾插 e
void add(int index, E element) 将 e 插入到 index 位置
boolean addAll(Collection c) 尾插 c 中的元素 E
remove(int index) 删除 index 位置元素
boolean remove(Object o) 删除遇到的第一个 o E
get(int index) 获取下标 index 位置元素 E
set(int index, E element) 将下标 index 位置元素设置为 element
void clear() 清空 boolean contains(Object o) 判断 o 是否在线性表中
int indexOf(Object o) 返回第一个 o 所在下标
int lastIndexOf(Object o) 返回最后一个 o 的下标
List subList(int fromIndex, int toIndex) 截取部分List
注意:ArrayList扩容是默认以当前size的两倍进行扩容,使用copyOf进行扩容