一、ArrayList的底层是Object类的数组,默认长度是10,超过10后,长度变为原长度的1.5倍。
二、可以简单的认为是一个动态数组;实际上ArrayList就是用数组实现的,长度不够时,调用Arrays.copyOf方法,拷 贝当前数组到一个新的长度更大的数组。
三、特点:随机访问速度快,插入和移除性能较差(数组的特点);
支持null元素;
有顺序;
元素可以重复;
线程不安全。
四、手写ArrayList
public class MyArrayList {
private Object[] elementData; //实质:Object数组
private int size; //长度
public MyArrayList(){ //默认初始长度是10
this(10);
}
public MyArrayList(int initalCapacity){ //赋初值时,判断初值是否大于0
if(initalCapacity<0){
try{
throw new Exception(); //不是就抛异常
}catch(Exception e){
e.printStackTrace();
}
}
elementData = new Object[initalCapacity]; //是就给Object;
}
public int size(){ //定义判断长度方法size()
return size;
}
public boolean isEmpty(){ //判断是否非空
return size == 0;
}
public void rangeCheck(int index){ //数组越界判断,是就抛异常
if(index<0 || index>=size){
try{
throw new Exception();
}catch(Exception e){
e.printStackTrace();
}
}
}
public void ensureCapacity() { //扩展长度
if(size>=elementData.length) {
Object[] temp = new Object[elementData.length*3/2];
System.arraycopy(elementData, 0, temp, 0, size);
elementData = temp;
}
}
/*
*增删改查
*/
public void add(Object obj) {
ensureCapacity();
elementData[size++] = obj;
}
public void add(int index, Object obj) {
rangeCheck(index);
ensureCapacity();
System.arraycopy(elementData, index, elementData, index+1, size-index);
elementData[index] = obj;
size++;
}
public Object get(int index) {
rangeCheck(index);
return elementData[index];
}
public Object set(int index, Object obj) {
rangeCheck(index);
Object oldValue = elementData[index];
elementData[index] = obj;
return oldValue;
}
public void remove(int index) {
rangeCheck(index);
ensureCapacity();
System.arraycopy(elementData, index+1, elementData, index, size-index-1);
size--;
}
public static void main(String[] args) {
MyArrayList list = new MyArrayList(2);
list.add("a");
list.add("b");
System.out.println(list.size());
list.add(1, "c");
System.out.println(list.get(1));
list.remove(1);
System.out.println(list.get(1));
}
}
五、实现与继承关系: