ArrayList底层实现源码解析

来源:互联网 发布:万彩动画大师 知乎 编辑:程序博客网 时间:2024/05/22 22:08
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 blocke.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));        }    //这里只实现了我们常用的一些方法,关于其他测试,大家也可以看源码来分析实现}}

0 0