目录
1.线性表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列...
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物 理上存储时,通常以数组和链式结构的形式存储。
2.顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成 数据的增删查改。
3. ArrayList简介
在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:
【说明】
1. ArrayList是以泛型方式实现的,使用时必须要先实例化
2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
4. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
5. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者 CopyOnWriteArrayList
6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表
4. ArrayList使用
ArrayList常见操作
方法 | 解释 |
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 |
5.ArrayList模拟实现
主要完成顺序的的增删改查,以及获取一个元素的下标,判断元素是否在顺序表内。
Ilist接口
public interface IList {
void add(int var1);
void add(int var1, int var2);
boolean contains(int var1);
int indexOf(int var1);
int get(int var1);
void set(int var1, int var2);
void remove(int var1);
int size();
void clear();
void display();
boolean isfull();
}
import java.util.Arrays;
public class ArrayList implements IList {
public int[] elem = new int[10];
public int usedsize;
public static final int DEFAULT_CAPACITY = 10;
public ArrayList() {
}
public void add(int data) {
if (this.isfull()) {
this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
}
this.elem[this.usedsize] = data;
++this.usedsize;
}
public void add(int pos, int data) {
this.checkPosOfAdd(pos);
if (this.isfull()) {
this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
}
for(int i = this.usedsize - 1; i >= pos; --i) {
this.elem[i + 1] = this.elem[i];
}
this.elem[pos] = data;
++this.usedsize;
}
private void checkPosOfAdd(int pos) {
if (pos < 0 || pos > this.usedsize) {
throw new PosException("pos位置为:" + pos);
}
}
public boolean contains(int toFind) {
for(int i = 0; i < this.usedsize; ++i) {
if (this.elem[i] == toFind) {
return true;
}
}
return false;
}
public int indexOf(int toFind) {
for(int i = 0; i < this.usedsize; ++i) {
if (this.elem[i] == toFind) {
return i;
}
}
return -1;
}
public int get(int pos) {
this.checkPosOfAdd(pos);
if (this.isempty()) {
throw new EmptyException("顺序表为空");
} else {
return this.elem[pos];
}
}
public void set(int pos, int value) {
this.checkPosOfAdd(pos);
if (this.isempty()) {
throw new EmptyException("顺序表为空");
} else {
this.elem[pos] = value;
}
}
public void remove(int toRemove) {
if (this.isempty()) {
throw new EmptyException("顺序表为空");
} else {
int index = this.indexOf(toRemove);
for(int i = index; i < this.usedsize - 1; ++i) {
this.elem[i] = this.elem[i + 1];
}
--this.usedsize;
}
}
public int size() {
return this.usedsize;
}
public void clear() {
this.usedsize = 0;
}
public void display() {
for(int i = 0; i < this.usedsize; ++i) {
System.out.print(this.elem[i] + " ");
}
System.out.println();
}
public boolean isfull() {
return this.usedsize == this.elem.length;
}
public boolean isempty() {
return this.usedsize == 0;
}
}