基于数组的顺序表实现
1.接口
package com.DS.ArrayList;
public interface Sequence {
void add(Object data);
Object remove(int index);
Object set(int index,Object newData);
Object get(int index);
boolean contains(Object data);
int size(); Object[] toArray();
void clear();
}
2.实现类
package com.DS.ArrayList;
import java.util.Arrays;
public class ArrayListImpl implements Sequence {
private Object[] elementDates;
private static final int DEFAULT_CAPACITY=10;
public int size;
private static final int MAX_ARRAY_SIZE=Integer.MAX_VALUE-8;
public ArrayListImpl(int capaCity) {
this.elementDates=new Object[capaCity];
}
public ArrayListImpl() {
this.elementDates =new Object[DEFAULT_CAPACITY];
}
@Override
public void add(Object data) {
ensureCapacity(size+1);
elementDates[size++]=data;
}
public void add(int index,Object date){
ensureCapacity(size+1);
for(int j=size;j<index;j--){
elementDates[j]=elementDates[j-1];
}
elementDates[index]=date;
size++;
}
@Override
public Object remove(int index) {
rangCheck(index);
Object oldDate = elementDates[index];
int moveSize = size-index-1;
if(moveSize>0) {
System.arraycopy(elementDates, index + 1, elementDates, index, moveSize);
}
elementDates[--size]=null;
return oldDate;
}
@Override
public Object set(int index, Object newData) {
rangCheck(index);
Object oldDate = elementDates[index];
elementDates[index]=newData;
return oldDate;
}
@Override
public Object get(int index) {
rangCheck(index);
return elementDates[index];
}
@Override
public boolean contains(Object data) {
if(data==null){
for(int i=0;i<size;i++){
if(elementDates[i]==null){
return true;
}
}
}else {
for(int i=0;i<size;i++){
if(elementDates[i].equals(data)){
return true;
}
}
}
return false;
}
@Override
public int size() {
return this.size;
}
@Override
public Object[] toArray() {
return Arrays.copyOf(elementDates,size);
}
@Override
public void clear() {
for(int i=0;i<elementDates.length;i++){
elementDates[i]=null;
}
this.size=0;
}
public void ensureCapacity(int minCap){
if(minCap-elementDates.length>0) {
grow(minCap);
}
}
private void grow(int minCap) {
int oldCap=elementDates.length;
int newCap=oldCap<<1;
if(newCap-minCap<0){
newCap=minCap;
}
if(minCap-MAX_ARRAY_SIZE>0){
throw new ArrayIndexOutOfBoundsException("超过最大阈值");
}
elementDates= Arrays.copyOf(elementDates,newCap);
}
private void rangCheck(int index){
if(index>=size){
throw new IndexOutOfBoundsException("下标不存在");
}
}
}
3.测试类
package com.DS.ArrayList;
public class TestDemo {
public static void main(String[] args) {
Sequence sequence = new ArrayListImpl(5);
sequence.add(1);
sequence.add(2);
sequence.add(3);
sequence.add(4);
sequence.add(5);
System.out.println(sequence.size());
((ArrayListImpl) sequence).add(3,8);
System.out.println(sequence.size());
}
}