Java的ArrayList实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java的ArrayList实现相关的知识,希望对你有一定的参考价值。

ArrayList是Java当中的一个泛型类,利用数组的形式来实现集合List接口,以达到动态数组的作用,在数据量不确定的情况下,使用ArrayList是一个不错的选择。

在本Demo中,仅仅是ArrayList的简单实现,目的是为了了解ArrayList的工作原理,加深对ArrayList的理解。

ArrayList能够实现动态数组的秘诀在于:每次添加元素时都要进行判断,检查数组是否已满,如果是,则新建一个数组,容量为原来的两倍,并将旧数组复制到新数组中,舍弃旧数组。这是ArrayList的关键,同时也是它的缺陷所在,因为这个扩容的操作是比较影响性能的 ,特别是一次性添加很多元素时,数组多次扩展。比如一次性添加10,000个元素,而ArrayList的初始大小为10,则10*2^10=10240,即数组进行了10次扩容操作。不过当初开发Java的人员也意识到这点,所以他们提供了一个可以自定义初始大小的构造方法,可以避免数组的多次扩展。

还有一点是很重要的,ArrayList是线程不安全的,如果在多线程中应当使用Vector(),它的原理跟ArrayList基本一样,但多加了synchronized关键字。

  1 package my;
  2 
  3 
  4 public class MyArrayList<AnyType>
  5 {
  6     private static final int DEFAULT_CAPACITY = 10;
  7     
  8     private int theSize;
  9     private AnyType[] theIteme;
 10     
 11     public MyArrayList()
 12     { Clear(); }
 13     
 14     public void Clear()
 15     { 
 16         theSize = 0;
 17         ensureCapacity(DEFAULT_CAPACITY);
 18     }
 19     
 20     public int size()
 21     { return theSize; }
 22     
 23     public boolean isEmpty()
 24     { return theSize == 0; }
 25     
 26     public void trimToSize()
 27     { ensureCapacity(theSize); }
 28     
 29     public AnyType get(int index)
 30     { 
 31         if(index < 0 || index > size())
 32             throw new ArrayIndexOutOfBoundsException();
 33         
 34         return theIteme[index];
 35     }
 36     
 37     public AnyType set(AnyType newValue, int index)
 38     {
 39         if(index < 0 || index > size())
 40             throw new ArrayIndexOutOfBoundsException();
 41         
 42         AnyType old = theIteme[index];
 43         theIteme[index] = newValue;
 44         
 45         return old;
 46     }
 47     
 48     public void add(AnyType x, int index)
 49     {
 50         if(theIteme.length == size())
 51         {
 52             ensureCapacity(size()*2 + 1);
 53         }
 54         
 55         for(int i = size(); i > index ; i--)
 56         {
 57             theIteme[i] = theIteme[i - 1];
 58         }
 59         theIteme[index] = x;
 60         theSize++;
 61     }
 62     
 63     public boolean add(AnyType x)
 64     {
 65         add(x, size());
 66         return true;
 67     }
 68     
 69     public AnyType remove(int index)
 70     {
 71         if(index < 0 || index < size())
 72             throw new ArrayIndexOutOfBoundsException();
 73         AnyType value = theIteme[index];
 74         for(int i = index; i < size() - 1; i++)
 75         {
 76             theIteme[i] = theIteme[i + 1];
 77         }
 78         return value;
 79     }
 80     
 81     public java.util.Iterator<AnyType> iterator()
 82     { return new ArrayListIterator();}
 83     
 84     
 85     private void ensureCapacity(int newCapacity)
 86     {
 87         if(newCapacity < theSize)
 88             return;
 89         
 90         AnyType[] old = theIteme;
 91         
 92         theIteme = (AnyType[]) new Object[newCapacity];
 93         for(int i = 0; i < size(); i++ )
 94         {
 95             theIteme[i] = old[i];
 96         }
 97     }
 98     
 99     private class ArrayListIterator implements java.util.Iterator<AnyType>
100     {
101         private int current = 0;
102         
103         public boolean hasNext()
104         { return current < size();}
105         
106         public AnyType next()
107         {
108             if(!hasNext())
109                 throw new java.util.NoSuchElementException();
110             return theIteme[current++];
111         }
112         
113         public void remove()
114         { MyArrayList.this.remove(--current);}
115     }
116 }

 

以上是关于Java的ArrayList实现的主要内容,如果未能解决你的问题,请参考以下文章

用Java写入Excel

在 Arraylist 的 listview 的 listitem 上显示值

Java容器之Collection与ArrayList一些理解及自己用代码实现ArrayList

对java中arraylist深入理解

片段之间的静态 ArrayList

JAVA——底层源码阅读——集合ArrayList的实现底层源码分析