用List接口实现顺序表思路
之前小咲说过interface接口是备忘录和作业的关系
这里List就相当于一个备忘录记录着你需要做什么作业
而作业呢就是你需要实现的ArrayList
在实现“作业”ArrayList之前,首先预习几个方法
查看jdk1.8文档
System.arraycopy
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
将指定源数组中的数组从指定位置复制到目标数组的指定位置。 阵列组件的一个子序列被从通过引用的源阵列复制src
被引用的目标阵列dest
。 复制的组件数量等于length
参数。 源阵列中位置srcPos
至srcPos+length-1
的组件分别复制到目标阵列的位置destPos
至destPos+length-1
。
如果src
个dest
参数指代相同的数组对象,则被处理是否在位置上的部件进行复印srcPos
通过srcPos+length-1
首先被复制到一个临时的阵列length
组分,然后将临时数组的内容被复制到的位置destPos
通过destPos+length-1
目标数组的。
Arrays.copyof
public static boolean[] copyOf(boolean[] original, int newLength)
复制指定的数组,截断或填充false (如有必要),以使副本具有指定的长度。 对于原始数组和副本都有效的所有索引,两个数组将包含相同的值。 对于在副本中而不是原件有效的任何索引,副本将包含false 。 当且仅当指定长度大于原始数组的长度时,这些索引才会存在。
参数
original
- 要复制的数组
newLength
- 要返回的副本的长度
结果
原始数组的副本,被截断或填充有假元素以获得指定的长度
——————————————————————————————————————————————
建立一个接口List
public interface List {
// 尾插
boolean add(int element);
// 把数据插入到 index 下标处
boolean add(int index, int element);
int get(int index);
int set(int index, int val);
// 删除指定位置的数据
int remove(int index);
int size();
boolean isEmpty();
}
顺序表(ArrayList) implements List
import java.util.Arrays;
public class MyArrayList implements List {
//初始化
int[] array = null;
int size = 0;
//顺序表的一般思路先申请一个空间或者确认空间容量是否够用
//再实现插入删除等功能
//特别注意的是由于顺序表的优点在于下标可以直接查找,存取速度高效,通过下标来直接存储
private void ensureCapacity() {
// 1. 如果容量够用,直接返回
if (array != null && size < array.length) {
return;
}
// 2. 计算新的容量大小
int capacity;
if (array == null) {
capacity = 10;
} else {
capacity = 2 * array.length;
}
// 3. 申请新空间 - 搬移 - 生成
if (array != null) {
array = Arrays.copyOf(array, capacity);
} else {
array = new int[capacity];
}
}
@Override
public boolean add(int element) {
return add(size, element);
}
@Override
public boolean add(int index, int element) {
// 1. 下标检查
if (index < 0 || index > size) {
System.out.println("下标错误");
return false;
}
// 2. 确保空间够用
ensureCapacity();
// 3. 为 index 下标,腾出位置来
System.arraycopy(array, index, array, index + 1, size - index);
// 4. 插入
array[index] = element;
// 5. 变更长度
size++;
return true;
}
@Override
public int get(int index) {
// 1. 判断下标合法性
if (index < 0 || index >= size) {
System.out.println("下标错误");
return -1;
}
return array[index];
}
@Override
public int set(int index, int val) {
// 1. 判断下标合法性
if (index < 0 || index >= size) {
System.out.println("下标错误");
return -1;
}
int oldVal = array[index];
array[index] = val;
return oldVal;
}
@Override
public int remove(int index) {
// 1. 判断下标合法性
if (index < 0 || index >= size) {
System.out.println("下标错误");
return -1;
}
int oldValue = array[index];
System.arraycopy(array, index + 1, array, index, size - index - 1);
size--;
return oldValue;
}
@Override
public int size() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public String toString() {
return Arrays.toString(Arrays.copyOf(array, size));
}
}
Main实现
public class Main {
private static void testList(List list) {
list.add(1);
list.add(2);
list.add(3);
list.add(4);
System.out.println(list.get(3));
System.out.println(list);
list.set(2, 100);
System.out.println(list);
list.remove(0);
list.remove(2);
list.remove(0);
list.remove(0);
System.out.println(list);
System.out.println(list.isEmpty());
}
public static void main(String[] args) {
MyArrayList arrayList = new MyArrayList();
testList(arrayList);
}
}
Answers
4
[1, 2, 3, 4]
[1, 2, 100, 4]
[]
true