1. 程式人生 > >ArrayList和陣列的優缺點比較

ArrayList和陣列的優缺點比較

ArrayList通俗來說就是一個動態的陣列,它可以動態地增加和減少元素,實現了ICollection和IList介面。相比陣列,有很大的優勢。我們先來看一下陣列的定義及使用,再看看ArrayList,觀察一下它們的優缺點。

     private Shape[] arrayshape = new Shape[250];
	public void setShape(int x1, int y1, Color color) {
	Shape shape = new Shape(x1, y1, color);
	arrayshape[index++] = shape;
	}
        	 for(int i=0;i<mouse.index;i++)
             {
        		Shape shape=arrayshape[i];
        		if(shape!=null) 
        		{
             	shape.drawShape(g);
        		}
        		else
        		break;
	 public void drawShape(Graphics g)
	 {
		 g.setColor(color);
		 g.drawOval(x1-CHESS_SIZE/2, y1-CHESS_SIZE/2, CHESS_SIZE, CHESS_SIZE);
		 g.fillOval(x1-CHESS_SIZE/2, y1-CHESS_SIZE/2, CHESS_SIZE, CHESS_SIZE);		 		
	 }	

我們這裡不深究具體程式碼及其引數,主要觀察陣列的使用。第一個語句定義了一個數組,這裡我們可以明顯發現我們需要手動去定義陣列的長度,也就是說陣列的大小已經被框死了,而且其儲存的形式是連續的,這不便於資料的新增,插入和移除。其賦值和修改的方式都是基於其角標。在java中,陣列可以存物件,在定義物件時為物件賦予相應的引數並將其存入陣列,取出時,也只要把它取出為擁有自己屬性的物件,然後便可以對其進行操作。在這個過程中,我們經常用到迴圈的方式。的確,它也是有自己的優勢的,操作簡單,速度快!
然後我們再來看看ArrayList:

static ArrayList<Bullet> bulletsMe = new ArrayList<Bullet>();//static可以保證物件的唯一性,別處通過類來呼叫
public void addBulletMe() {
int num = 1 + (int) (Math.random() * 20);
Bullet bullet = new Bullet(bluePlane.x+bluePlane.size/2-15, bluePlane.y, num,0);
bulletsMe.add(bullet);
	}
for(int i=0;i<Listener.bulletsMe.size();i++){
					if(Listener.bulletsMe.get(i).type==0)
					{
					Bullet bullet = Listener.bulletsMe.get(i);
					bullet.y -= 5;
					}

這依然是從程式中擷取的關於ArrayList的部分程式碼,涉及到定義,存物件,取物件的操作。這裡涉及到了static的一處應用,我們簡單解釋一下,static可以確保這個ArrayList物件在程式中的唯一性,比較方便的是我們在其他類中可以通過ArrayList所在類(此處是Listener)直接呼叫這個ArrayList物件。我們可以發現,ArrayList沒有設定長度,因此,它具有很大的靈活性,似乎ArrayList和陣列相比更勝一籌,但事實也確實是這樣,ArrayList的可操作性很強,我們下面簡單介紹它的一些方法:
1.add(E e)
將指定的元素新增到此列表的尾部。
2.add(int index, E element)
將指定的元素插入此列表中的指定位置。
3.addAll(Collection<? extends E> c)
按照指定 collection 的迭代器所返回的元素順序,將該 collection 中的所有元素新增到此列表的尾部。
4.addAll(int index, Collection<? extends E> c)
從指定的位置開始,將指定 collection 中的所有元素插入到此列表中。
5.clear()
移除此列表中的所有元素。
6.clone()
返回此 ArrayList 例項的淺表副本。
7.contains(Object o)
如果此列表中包含指定的元素,則返回 true。
8.ensureCapacity(int minCapacity)
如有必要,增加此 ArrayList 例項的容量,以確保它至少能夠容納最小容量引數所指定的元素數。
9.get(int index)
返回此列表中指定位置上的元素。
10.indexOf(Object o)
返回此列表中首次出現的指定元素的索引,或如果此列表不包含元素,則返回 -1。
11.isEmpty()
如果此列表中沒有元素,則返回 true
12.lastIndexOf(Object o)
返回此列表中最後一次出現的指定元素的索引,或如果此列表不包含索引,則返回 -1。
13.remove(int index)
移除此列表中指定位置上的元素。
14.remove(Object o)
移除此列表中首次出現的指定元素(如果存在)。
15.removeRange(int fromIndex, int toIndex)
移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之間的所有元素。
16.set(int index, E element)
用指定的元素替代此列表中指定位置上的元素。
17.size()
返回此列表中的元素數。
18.toArray()
按適當順序(從第一個到最後一個元素)返回包含此列表中所有元素的陣列。
19.toArray(T[] a)
按適當順序(從第一個到最後一個元素)返回包含此列表中所有元素的陣列;返回陣列的執行時型別是指定陣列的執行時型別。
20.trimToSize()
將此 ArrayList 例項的容量調整為列表的當前大小。
確實,ArrayList和陣列相比有更加強大的功能,可以對資料方便地新增,插入和移除,在複雜工程中有更廣泛地應用前景,但當向集合插入不同型別的資料後,在進行資料處理時容易出現型別不匹配的錯誤,使用時需要進行型別轉換處理,存在裝箱與拆箱操作,造成效能大量損耗。綜合來說,ArrayList優於陣列,它也是java程式設計中必須掌握的知識點。