手写ArrayList

一:代码实现
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);接口

你可能感兴趣的:(集合相关)