代码献上:
import java.util.Arrays;
public class ArrayList implements List{
private Object[] elementData;//底层是一个数组,目前还没有确定长度
private int size;//不是数组分配了几个空间,而是元素的个数
public ArrayList(){
//没有指定长度,默认长度为0
this(4);
//没有指定长度,长度是0
//elementData = new Object[]{};
}
public ArrayList(int initialCapacity){
//给数组分配指定数量的空间
elementData = new Object[initialCapacity];
//指定线性表的元素个数,默认是0
size=0;
}
@Override
public int size() {
return size;
}
@Override
public Object get(int i) {
if(i<0||i>=size){//i<0或者i>=size
throw new MyArrayIndexIutOfBoundsException("数组索引越界异常:"+i);
}
return elementData[i];
}
@Override
public boolean isEmpty() {
return size==0;
}
@Override
public boolean contains(Object e) {
for(int i=0;i<size;i++){
if(e.equals(elementData[i])){
return true;
}
}
return false;
}
@Override
public int indexOf(Object e) {
for(int j=0;j<size;j++){
if(e.equals(elementData[j])){
return j;
}
}
return 0;
}
@Override
public void add(Object e) {
/*
//数组满了。数组扩容
if(size==elementData.length){
grow();
}
//给数组赋值
elementData[size] = e;
//元素个数加一
size++;
//elementData[size++]=e;
*/
this.add(size, e);
}
private void grow(){
/*//创建新的数组,长度是数组的2倍
Object[] newArr = new Object[elementData.length*2];
//将旧数组的的数据拷贝到新数组中
for(int i=0;i<size;i++){
newArr[i] = elementData[i];
}
//让elementData指向新数组
elementData = newArr;
*/
elementData = Arrays.copyOf(elementData,elementData.length*2);
}
@Override
public Object remove(int i) {
if(i<0||i>size){
throw new MyArrayIndexIutOfBoundsException("数组索引越界异常");
}
System.arraycopy(elementData, i+1, elementData, i,size-(i+1));
return elementData[i];
}
@Override
public Object set(int i, Object e) {
if(i<0||i>size){
throw new MyArrayIndexIutOfBoundsException("数组索引越界异常");
}
elementData[i]=e;
return elementData[i];
}
@Override
public void add(int i, Object e) {
//i的位置要正确
if(i<0||i>size){
throw new MyArrayIndexIutOfBoundsException("数组索引越界异常:"+i);
}
if(size==elementData.length){
grow();
}
//后移i及其后面的元素,从最后一个开始
for(int j=size;j>i;j--){
elementData[j] = elementData[j-1];
}
//给数组第i个位置赋值
elementData[i] = e;
size++;
}
@Override
public String toString() {
if(size==0){
return "[]";
}
StringBuilder builder = new StringBuilder("[");
for(int i=0;i<size;i++){
if(i!=size-1){
builder.append(elementData[i]+",");
}else{
builder.append(elementData[i]);
}
}
builder.append("]");
return builder.toString();
}
@Override
public void clear() {
for(int i=0;i<size;i++){
elementData[i]=null;
}
size=0;
}
@Override
public Object[] toarray() {
return Arrays.copyOf(elementData, size);
}
}