JAVA--自己实现ArrayList
2017-06-22 17:25
369 查看
本次实现的ArrayList并未使用泛型,以后添加。
在自己实现ArrayList之前强烈建议先看一遍JDK的源码,有助于理解。
附上一个链接深入Java集合学习系列:ArrayList的实现原理
我自己实现了ArrayList中的add,get,set,remove方法
MyArrayList:
测试:
在自己实现ArrayList之前强烈建议先看一遍JDK的源码,有助于理解。
附上一个链接深入Java集合学习系列:ArrayList的实现原理
我自己实现了ArrayList中的add,get,set,remove方法
MyArrayList:
import java.util.Arrays; /* * ArrayList的底层实现为数组 * MyArrayList暂时不考虑泛型 */ public class MyArrayList { private Object[] elementData;//存放Object的数组 private int size;//ArrayList大小 public MyArrayList() { this(10);//如果不指定大小,默认大小为10 } public MyArrayList(int initSize) { if(initSize<0){ throw new IllegalArgumentException("IllegalArgument:"+initSize);//参数不合法,抛出异常 } elementData = new Object[initSize]; } public void add(Object obj) {//在末尾条件元素 checkCapacity(size+1);//插入一个元素,至少需要size+1大小的空间 elementData[this.size++] = obj; } public void add(int index,Object obj) {//在index处插入元素obj RangeCheck(index); checkCapacity(size+1);//插入一个元素,至少需要size+1大小的空间 System.arraycopy(elementData, index, elementData, index+1, size-index);//将index后的元素都后移一个位置 elementData[index] = obj; size++; } private void checkCapacity(int needCapacity) {//检查ArrayList开辟的空间是否足够,如果不足则进行扩容 if(needCapacity>elementData.length){//空间不足,扩容 Object oldelementData[] = elementData; int newSize = this.size*2+1;//扩容的空间 elementData = new Object[newSize]; elementData = Arrays.copyOf(oldelementData, newSize); } } private void RangeCheck(int index) {//检查索引是否合法 if(index<0||index>=size){ throw new IndexOutOfBoundsException("IllegalArgument"+index);//出界,抛出异常 } } public Object get(int index) {//根据索引返回对象 RangeCheck(index); return elementData[index]; } public Object set(int index,Object obj) {//将index位置置为obj RangeCheck(index); Object oldvalue = elementData[index]; elementData[index] = obj;//设置新值 return oldvalue;//返回旧值 } public Object remove(int index) {//删除index处的元素 RangeCheck(index); Object oldValue = elementData[index]; int moveNum = size-index-1; if(moveNum>0){ System.arraycopy(elementData, index+1, elementData, index, moveNum); } elementData[--size] = null;//让垃圾回收器回收 return oldValue;//返回旧值 } public boolean remove(Object obj) {//删除等于obj的元素,成功返回true,失败返回false if(obj == null){ for(int i=0;i<size;i++){ if(elementData[i]==null){ fastremove(i); return true; } } }else { for(int i=0;i<size;i++){ if(obj.equals(elementData[i])){//obj不为null,一定要在前,否则使用elementData[i]调用equals()可能导致控制在异常 fastremove(i); return true; } } } return false; } public void fastremove(int index) { int moveNum = size-index-1; if(moveNum>0){ System.arraycopy(elementData, index+1, elementData, index, moveNum); } elementData[--size] = null;//让垃圾回收器回收 } public int size(){ return this.size; } public int length() { return elementData.length; } }
测试:
public class TestMyArrayList { public static void main(String[] args) { MyArrayList List = new MyArrayList(5); //末尾插入 List.add(new A("张三")); List.add(new A("李四")); List.add(new A("王五")); List.add(new A("JACK")); List.add(new A("张三")); List.add(new A("李四")); List.add(new A("王五")); List.add(new A("JACK")); //自选位置插入 List.add(2,new A("TOM")); System.out.println(List.size()); System.out.println(((A)List.get(8)).name); //将index处置为新值 A oldA = (A)List.set(3, new A("Lucy")); System.out.println(oldA.name);//打印旧值 System.out.println(((A)List.get(3)).name);//打印新值 System.out.println(List.size()); //将index处的元素删除 oldA = (A)List.remove(3); System.out.println(oldA.name);//打印删除的元素 System.out.println(List.size()); //删除和指定对象匹配的元素 A temp = new A("Lily"); List.add(temp); System.out.println(List.remove(temp)); } } class A{ String name; public A(String name) { super(); this.name = name; } }
相关文章推荐
- Java -- 自己实现数组列表(Arraylist)
- java中自己实现一个ArrayList
- 自己用java实现LinkList和arrayList
- 自己理解的java.util.ArrayList(二)实现类
- [JAVA]集合框架之自己实现一个具有基本增查删改功能的ArrayList
- Java中SJBArrayList自己简单实现ArrayList
- java自己实现顺序线性表ArrayList
- Java之实现自己的ArrayList与LinkedList
- 数据结构—顺序表(自己实现Java的ArrayList)
- 【java集合】自己实现简易的ArrayList
- 用java代码实现一个自己的栈.
- 深入Java集合学习系列:ArrayList的实现原理
- 自己琢磨的 图像相似度算法 JAVA版实现
- 用Java实现自己的数据库OR映射框架
- 使用BlazeDS实现java与flex传对象时,RemoteClass中包含自己写的类,后台无法转换的问题
- 自己实现的JAVA转码工具类
- ArrayList Java实现
- 自己理解的java.util.ArrayList(三)运行类
- Java JDK中ArrayList的代码实现
- 使用JMF实现java写自己的视频播放器