根据list集合的原理,简单的实现一版原理,有助于更好的了解jdk源码。
1.构造list接口:
package com.arraylist;
public interface ExtList<T> {
boolean add(T t);
T get(int i );
}
2.实现ArrayList:
package com.arraylist;
import org.springframework.context.ConfigurableApplicationContext;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
public class ExtArrayList<T> implements ExtList<T>{
private final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
transient Object[] elementData;
private int size;
private static final int DEFAULT_CAPACITY = 10;
public ExtArrayList(){
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
// ArrayList 指定 数组初始的容量
public ExtArrayList(int initialCapacity) {
if (initialCapacity < 0) {
throw new IllegalArgumentException("初始容量不能小于0");
}
elementData = new Object[initialCapacity];
}
@Override
public boolean add(T t) {
// //如果数组长度为0,
// if(elementData.length == 0){
// //初始化数组
// elementData = new Object[DEFAULT_CAPACITY];
// }else if(elementData.length > 0){
//如果本身存在指定长度数组,且数组位置已满则扩容
//无论数组是否已初始化,执行此代码
ensureCapacityInternal(size + 1);
// }
//赋值
elementData[size++] = t;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private int calculateCapacity(Object[] elementData, int minCapacity) {
//判断如果数组为空,设置初始化长度
if(elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA){
return Math.max(DEFAULT_CAPACITY,minCapacity);
}
return minCapacity;
}
public void ensureExplicitCapacity(int initCapacity){
if(elementData.length < initCapacity){
int oldCapacity = elementData.length;
//扩容1.5倍
int newCapacity = oldCapacity + (oldCapacity>>1);
//如果数组长度为1,那么如何扩容
if(newCapacity < initCapacity){
//数组按照initCapacity扩容
newCapacity = initCapacity;
}
// Object[] objects = new Object[newCapacity];
// for (int i = 0; i < elementData.length; i++) {
// objects[i] = elementData[i];
// }
// objects[size++] = t;
// elementData = objects;
// 将老数组的值赋值到新数组里面去,等价于上面代码
elementData = Arrays.copyOf(elementData,newCapacity);
}
}
@Override
public T get(int i) {
return (T)elementData[i];
}
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException("角标越界");
}
public static void main(String[] args) {
// ArrayList<Object> list = new ArrayList<>();
ExtArrayList<Object> list = new ExtArrayList<>();
list.add("123");
list.add("444");
list.add("666");
System.out.println(list.get(1));
for (int i = 0; i < list.size; i++) {
System.out.println(list.elementData[i]);
}
// ConfigurableApplicationContext
// ArrayList<Object> list1= new ArrayList<>(15);
// list1.add("123");
// list1.add("444");
// list1.add("666");
}
}