首页 > 开发 > Java > 正文

Java 中模仿源码自定义ArrayList

2024-07-13 10:05:48
字体:
来源:转载
供稿:网友

javascript/35080.html">Java 中模仿源码自定义ArrayList

最近看了下ArrayList的源码,抽空根据ArrayList的底层结构写了一个功能简单无泛型的自定义ArrayLsit,帮助自己更好理解ArrayList:,其实现的底层数据结构为数Object组,代码如下:

/**  * 自己实现一个ArrayList  *  */ public class MyArrayList {      private Object[] elementData;   private int size;         public int size(){     return size;   }      public boolean isEmpty(){     return size==0;   }   //默认容量为10   public MyArrayList(){     this(10);   }   /**    * 自定义容量    * @param initialCapacity    */   public MyArrayList(int initialCapacity){     if(initialCapacity<0){       try {         throw new Exception();       } catch (Exception e) {         e.printStackTrace();       }     }     elementData = new Object[initialCapacity];   }   /**    * 添加一个元素    * @param obj    */   public void add(Object obj){     //数组扩容和数据的拷贝,重新new一个数组     if(size==elementData.length){       Object[] newArray = new Object[size*2+1];       System.arraycopy(elementData, 0, newArray, 0, elementData.length);        elementData = newArray;     }          elementData[size++]=obj; //   size++;   }   /**    * 通过索引获取元素    * @param index    * @return    */   public Object get(int index){     rangeCheck(index);          return elementData[index];   }   /**    * 通过索引删除元素    * @param index    */   public void remove(int index){     rangeCheck(index);          int numMoved = size - index - 1;     if (numMoved > 0){       System.arraycopy(elementData, index+1, elementData, index,           numMoved);     }     elementData[--size] = null; // Let gc do its work   }   /**    * 删除对应的元素(利用equal判断元素是否一致)    * @param obj    */   public void remove(Object obj){     for(int i=0;i<size;i++){       if(get(i).equals(obj)){ //注意:底层调用的equals方法而不是==.         remove(i);       }     }   }   /**    * 设置索引对应的元素    * @param index    * @param obj    * @return    */   public Object set(int index,Object obj){     rangeCheck(index);      Object oldValue = elementData[index];     elementData[index] = obj;     return oldValue;   }   /**    * 将元素插入对应的位置    * @param index    * @param obj    */   public void add(int index,Object obj){     rangeCheck(index);          ensureCapacity(); //数组扩容          System.arraycopy(elementData, index, elementData, index + 1,          size - index);     elementData[index] = obj;     size++;   }   /**    * 数组扩容    */   private void ensureCapacity(){     //数组扩容和数据的拷贝         if(size==elementData.length){           Object[] newArray = new Object[size*2+1];           System.arraycopy(elementData, 0, newArray, 0, elementData.length); //             for(int i=0;i<elementData.length;i++){ //               newArray[i] = elementData[i]; //             }           elementData = newArray;         }   }      /**    * 数组下标检查    * @param index    */   private void rangeCheck(int index){     if(index<0||index>=size){       try {         throw new Exception();       } catch (Exception e) {         e.printStackTrace();       }     }   }         public static void main(String[] args) {     MyArrayList list = new MyArrayList(3);     list.add("333");     list.add("444");     list.add("5");     list.add("344433");     list.add("333");     list.add("333");     for (int i = 0; i < list.size(); i++) {       System.out.println(list.get(i));      }     System.out.println("------------------------------");      list.remove("444");     list.add(2, "a");     for (int i = 0; i < list.size(); i++) {       System.out.println(list.get(i));      }   }  } 

测试结果:

3334445344433333333------------------------------3335a344433333333

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表