话不多说直接上代码
public interface List<E> extends Iterable<E>{
//获取当前线性表的最大容量
public int getCapacity();
//获取线性表中有效元素的个数
public int size();
//判断线性表是否为空
public boolean isEmpty();
//在表尾添加元素
public void add(E e) ;
//在指定索引处添加元素
public void add(int index,E e);
//删除指定元素
public void remove(E e);
//删除指定索引的元素
public void remove(int index);
//修改指定索引的元素,返回该位置原来的元素
public E set(int index,E e);
//获取指定元素的索引
public int indexOf(E e);
//判断线性表是否包含指定元素
public boolean contains(E e);
//获取指定索引的元素
public E get(int index);
//清空线性表
public void clear();
//根据指定迭代器对线性表进行排序
public void sort(Comparator<E> comparator);
//获取子表
public List<E> subList(int fromIndex,int endIndex);
}
public class ArrayList<E> implements List<E>{
//首先我们必须有一个数组存放数据
private E[] data;
//存放有效元素的个数
private int size;
//默认的初始容量
private static final int DEFAULT_CAPACITY=10;
public ArrayList(int size) {
if(size<DEFAULT_CAPACITY) {
throw new IllegalArgumentException("size can not < 10");
}
data=(E[])new Object[size];
size=0;
}
public ArrayList() {
this(DEFAULT_CAPACITY);
}
public ArrayList(E[] arr) {
if(arr==null||arr.length==0) {
throw new IllegalArgumentException("arr can not to be null");
}
data=(E[])new Object[DEFAULT_CAPACITY];
for(int i=0;i<arr.length;i++) {
add(arr[i]);
}
}
@Override
public int getCapacity() {
return data.length;
}
@Override
public int size() {
return size;
}
@Override
public boolean isEmpty() {
return size==0;
}
//该方法其实等同于指定在表尾添加元素
@Override
public void add(E e) {
add(size,e);
}
@Override
public void add(int index, E e) {
if(index<0||index>size) {
throw new IndexOutOfBoundsException("index is illegal in method add");
}
if(size==data.length) {
//每次以两倍扩容
resize(size*2);
}
for(int i=size;i>index;i--) {
data[i]=data[i-1];
}
data[index]=e;
size++;
}
private void resize(int newLen) {
E[] newData=(E[])new Object[newLen];
for(int i=0;i<size;i++) {
newData[i]=data[i];
}
data=newData;
}
@Override
public void remove(E e) {
remove(indexOf(e));
}
@Override
public void remove(int index) {
if(index<0||index>=size) {
throw new IndexOutOfBoundsException("index is illegal in method remove");
}
for(int i=index;i<size-1;i++) {
data[i]=data[i+1];
}
size--;
if(size<data.length/4&&data.length>10) {
resize(data.length/2);
}
}
@Override
public E set(int index, E e) {
if(index<0||index>=size) {
throw new IndexOutOfBoundsException("index is illegal in method set");
}
E old=data[index];
data[index]=e;
return old;
}
@Override
public int indexOf(E e) {
for(int i=0;i<size;i++) {
if(data[i].equals(e)) {
return i;
}
}
return -1;
}
@Override
public boolean contains(E e) {
return indexOf(e)!=-1;
}
@Override
public E get(int index) {
if(index<0||index>=size) {
throw new IndexOutOfBoundsException("index is illegal in method set");
}
return data[index];
}
@Override
public void clear() {
data=(E[]) new Object[DEFAULT_CAPACITY];
size=0;
}
@Override
public void sort(Comparator<E> comparator) {
for(int i=0;i<size;i++) {
E temp=data[i];
int j;
for(j=i;j>0&&comparator.compare(data[j-1], temp)>0;j--) {
data[j]=data[j-1];
}
data[j]=temp;
}
}
@Override
public List<E> subList(int fromIndex, int endIndex) {
if(fromIndex>endIndex) {
throw new IllegalArgumentException("fromIndex can not upper to endIndex");
}
if(fromIndex<0) {
throw new IllegalArgumentException("fromIndex can not <0");
}
if(endIndex>=size) {
throw new IllegalArgumentException("endIndex can not >=size");
}
List<E> list=new ArrayList<>(DEFAULT_CAPACITY);
for(int i=fromIndex;i<=endIndex;i++) {
list.add(data[i]);
}
return list;
}
@Override
public Iterator<E> iterator() {
Iterator<E> itertor =new Iterator<E>() {
private int index;
@Override
public boolean hasNext() {
return index<size;
}
@Override
public E next() {
return data[index++];
}
};
return itertor;
}
@Override
public String toString() {
StringBuilder str=new StringBuilder();
str.append("[");
if(size==0) {
str.append("]");
}else {
for(int i=0;i<size;i++) {
str.append(data[i]);
if(i!=size-1) {
str.append("、");
}else {
str.append("]");
}
}
}
str.append(size+"/"+data.length);
return str.toString();
}
}