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实现的主要内容,如果未能解决你的问题,请参考以下文章
在 Arraylist 的 listview 的 listitem 上显示值