动态数组
动态数组的特点
逻辑结构:线性的
物理结构:顺序结构
申请内存:一次申请一大段连续的空间,一旦申请到了,内存就固定了。
存储特点:所有数据存储在这个连续的空间中,数组中的每一个元素都是一个具体的数据(或对象),所有数据都紧密排布,不能有间隔。
动态数组的基本操作
与数据结构相关的数据操作:
- 插入
- 删除
- 修改
- 查找
- 遍历
public interface Container<E> extends Iterable<E>{
void add(E e);
void insert(int index,E value);
void delete(E e);
void delete(int index);
E update(int index, E value);
void update(E old, E value);
boolean contains(E e);
int indexOf(E e);
E get(int index);
Object[] getAll();
int size();
}
动态数组实现
import java.util.Arrays;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class MyArrayList<E> implements Container<E>{
private Object[] all;
private int total;
public MyArrayList(){
all = new Object[5];
}
@Override
public void add(E e) {
ensureCapacityEnough();
all[total++] = e;
}
private void ensureCapacityEnough() {
if(total >= all.length){
all = Arrays.copyOf(all, all.length*2);
}
}
@Override
public void insert(int index, E value) {
//是否需要扩容
ensureCapacityEnough();
addCheckIndex(index);
if(total-index>0) {
System.arraycopy(all, index, all, index+1, total-index);
}
all[index]=value;
total++;
}
private void addCheckIndex(int index) {
if(index<0 || index>total){
throw new IndexOutOfBoundsException(index+"越界");
}
}
@Override
public void delete(E e) {
int index = indexOf(e