手动实现一个MyArrayList, 要求实现添加和扩容方法:
版本一:
MyArrayList.java
public class MyArrayList<E> {
//默认容量
private static final int DEFAULT_CAPACITY=10;
//最大容量
private static final int MAX_CAPACITY=Integer.MAX_VALUE-8;
//底层用数组实现
private Object[] elements;
//当前存储的元素个数
private int size;
//元素修改的次数
private int modCount;
//默认构造方法
public MyArrayList(){
elements=new Object[DEFAULT_CAPACITY];
}
//在末尾添加元素
public boolean add(E e){
//判断是否还有空间存储元素
if (size==elements.length){
//如果当前底层数组已达最大容量
if (elements.length==MAX_CAPACITY){
throw new ArrayStoreException();
}
//扩容1.5倍
grow(elements.length+(int)(elements.length>>1));
}
elements[size]=e;//将新添加的元素存入elements[]数组
size++;
return true;
}
private void grow(int newLength){
//创建新数组 Object[]的对象newElements
Object[] newElements = new Object[newLength];
//将原来数组elements[]中的元素复制到新对象数组 newElements[]中
for (int i = 0; i <elements.length ; i++) {
newElements[i]=elements[i];
}
//将原来数组elements指向新数组地址
elements=newElements;
}
@Override
public String toString() {
return "MyArrayList{" +
"elements=" + Arrays.toString(elements) +
", size=" + size +
", modCount=" + modCount +
'}';
}
}
test.java
public class test {
public static void main(String[] args) {
MyArrayList<String> myArrayList=new MyArrayList<>();
myArrayList.add("大娃");
myArrayList.add("二娃");
myArrayList.add("三娃");
myArrayList.add("四娃");
myArrayList.add("五娃");
myArrayList.add("六娃");
myArrayList.add("七娃");
//测试扩容
System.out.println(myArrayList);
myArrayList.add("一仙女");
myArrayList.add("二仙女");
myArrayList.add("三仙女");
myArrayList.add("四仙女");
myArrayList.add("五仙女");
myArrayList.add("六仙女");
myArrayList.add("七仙女");
System.out.println(myArrayList);
}
}
结果输出;
MyArrayList{elements=[大娃, 二娃, 三娃, 四娃, 五娃, 六娃, 七娃, null, null, null], size=7, modCount=0}
MyArrayList{elements=[大娃, 二娃, 三娃, 四娃, 五娃, 六娃, 七娃, 一仙女, 二仙女, 三仙女, 四仙女, 五仙女, 六仙女, 七仙女, null], size=14, modCount=0}