一:代码实现
public class WjcArrayList {
//ArrayList底层采用数组存放
private Object[] elementDate;
//默认初始容量
private static final int DEFAULT_CAPACITY=2;
//实际存储容量大小
private int size;
//指定数组初始容量
public WjcArrayList(int capacity){
if(capacity<0){
throw new IllegalArgumentException("初始值不能小于0");
}else{
elementDate = new Object[capacity];
}
}
//默认初始容量为10
public WjcArrayList(){
this(DEFAULT_CAPACITY);
}
//数组添加方法
public void add(Object object){
//1,判断实际存储容量是否大于初始容量,若大于则扩容
kuorong(size+1);
//2,使用下角标赋值
elementDate[size++] = object;
}
//集合指定位置添加元素
public void add(int index,Object object){
//1,判断实际存储容量是否大于初始容量,若大于则扩容
kuorong(size+1);
//将指定位置的后面元素统一向后移动一位
System.arraycopy(elementDate, index, elementDate, index+1, size-index);
elementDate[index]=object;
size++;
}
//集合获取元素方法
public Object get(int index){
rangeCheck(index);
return elementDate[index];
}
//集合通过下角标删除
public Object remove(int index){
Object object = get(index);
//计算删除元素后面的数据
int removeCount = size-index-1;
//删除原理分析(删除元素后面的整体往前移位)
if(removeCount>0)
System.arraycopy(elementDate, index+1, elementDate, index, removeCount);
//将最后一个位置置为空
elementDate[--size] = null;
return index;
}
//集合通过对象删除
public boolean remove(Object object){
for (int i = 0; i < elementDate.length; i++) {
Object value = elementDate[i];
if(value.equals(object)){
remove(i);
}
}
return true;
}
//扩容封装
private void kuorong(int mincapacity){
if(size==elementDate.length){
int oldcapacity = elementDate.length;
//扩容为1.5倍
int newcapacity = oldcapacity+(oldcapacity >> 1);
//使用Arrays.copyOf接口方法进行扩容
elementDate = Arrays.copyOf(elementDate, newcapacity);
//保证新数组容量大于等于初始容量
if(newcapacity-mincapacity<0){
newcapacity = mincapacity;
}
}
}
//获取集合长度
public int size(){
return size;
}
//检测是否越界
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException("越界啦!!!");
}
}
二:与Vector集合的比较:
(1)Vector是线程安全的源码中有好多方法都添加了Sychronized,ArrayList线程不安全所以效率比ArrayList低。
(2)Vecctor扩容是默认是原来的2倍,ArrayList默认是原来的1.5倍。Vecctor默认初始数组大小是10,ArrayList初始数组长度是10,两个集合的源码一样。
三:与LinkedList的比较:
(1)都是List的子接口,ArrayList底层采用数组添加元素,按照下标查找速度快,但是插入和删除用到了扩容技术需要将元素往前或者往后移动,所以速度慢,而LinkedList底层采用双链表添加元素,查找元素时需要遍历所以速度慢,而添加和删除只需要改变前后节点的关系,所以速度比较快。
(2)ArrayList底层扩容技术使用到了elementDate = Arrays.copyOf(elementDate, newcapacity);接口
添加和删除时用到了System.arraycopy(elementDate, index+1, elementDate, index, removeCount);接口