• 技术文章 >Java >java教程

    Java中ArrayList自定义模仿源码的示例

    黄舟黄舟2017-03-27 10:13:46原创489
    这篇文章主要介绍了Java 中模仿源码自定义ArrayList的相关资料,需要的朋友可以参考下

    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

    以上就是Java中ArrayList自定义模仿源码的示例的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    上一篇:java中正确使用ThreadLocal的实例代码分析 下一篇:java双向链表实现的示例代码分享
    大前端线上培训班

    相关文章推荐

    • 理解java8中java.util.function.*pojo反射新方法(附代码)• 浅析安卓app和微信授权登录及分享完整对接(代码分享)• 教你一招搞定时序数据库在Spring Boot中的使用• 一招教你使用java快速创建Map(代码分享)• PlayFramework 完整实现一个APP(十一)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网