ArrayList底层实现源码解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33696779/article/details/69802584
package com.collection;


import java.util.ArrayList;
import java.util.List;
/**
 * 模拟ArrayList底层实现基础方法 
 * @author Mrzhang
 *
 * @param <E>
 */
public class MyArrayList<E> {
//基础数组长度设置 
private static final int CAPCITY=10;
//底层数组
transient Object[] elementData;
//加入数据长度,不代表数组长度
private int size;
  public MyArrayList(){
  this(10);
};

public MyArrayList(int size){
//数组初始化
elementData=new Object[size];
}
//数组扩容处理
private void grow(int index){
if(size==index){
int capcity=elementData.length+(elementData.length>>1);
            Object[] newArray=new Object[capcity];
            System.arraycopy(elementData, 0, newArray, 0, elementData.length);
            elementData=newArray;
}
}
//越界处理
private void rangeCheck(int index){
if(index>=size){
try {
throw new Exception();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("数组越界");
}
 } 
}
//获取长度
public int size(){
return size;
}
//添加元素
public void add(E e){
grow(elementData.length);
        elementData[size++]=e;
}
//在指定位置添加元素
public void add(int index,E e){
rangeCheck(index);
grow(elementData.length);
//注意 数组长度不等于size 可能比size大很多,下边这种方法可能报异常
//int length=elementData.length
//System.arraycopy(elementData, index, elementData, index+1,length-index);
System.arraycopy(elementData, index, elementData, index+1,size-index);
elementData[index]=e;
size++;
}
//替换指定位置元素
public void set(int index,E e){
rangeCheck(index);
elementData[index]=e;
}
    //查看元素
public E get(int index){
rangeCheck(index);
return (E) elementData[index];
}
//删除元素
public E remove(int index){
rangeCheck(index);
Object obj=elementData[index];
        System.arraycopy(elementData, index+1, elementData, index, elementData.length-(index+1));
        elementData[size--]=null;
return (E)obj;
}
//删除指定对象  一次删除一个
public boolean remove(Object e){
if(e==null){
for(int i=0;i<elementData.length;i++){
if(elementData[i]==null){
remove(i);
return true;
}
}
}else{
for(int i=0;i<elementData.length;i++){
if(elementData[i].equals(e)){
remove(i);
return true;
} 
}
}
return false;
}
public static void main(String[] args) {
MyArrayList arrayList=new MyArrayList();
   arrayList.add("二哈");
   arrayList.add("三哈");
   arrayList.add("四哈");
   arrayList.add(2,"五哈");
   arrayList.set(1, "十哈");
   arrayList.add(null);
   arrayList.remove(null);
        for(int i=0;i<arrayList.size();i++){
        System.out.println(arrayList.get(i));
        }
    //这里只实现了我们常用的一些方法,关于其他测试,大家也可以看源码来分析实现
}

}

猜你喜欢

转载自blog.csdn.net/qq_33696779/article/details/69802584