欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java 中模仿源码自定义ArrayList

程序员文章站 2024-03-02 20:37:10
java 中模仿源码自定义arraylist 最近看了下arraylist的源码,抽空根据arraylist的底层结构写了一个功能简单无泛型的自定义arraylsit,帮...

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));  
    } 
  } 
 
} 

测试结果:

333

444

5

344433

333

333

------------------------------

333

5

a

344433

333

333

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