天天看點

正确使用Vector類

Vector主要用來儲存各種類型的對象(包括相同類型和不同類型的對象)。但是在一些情況下使用會給程式帶來性能上的影響。這主要是由Vector類的兩個特點所決定的。第一,Vector提供了線程的安全保護功能。即使Vector類中的許多方法同步。但是如果你已經确認你的應用程式是單線程,這些方法的同步就完全不必要了。第二,在Vector查找存儲的各種對象時,常常要花很多的時間進行類型的比對。而當這些對象都是同一類型時,這些比對就完全不必要了。是以,有必要設計一個單線程的,儲存特定類型對象的類或集合來替代Vector類.用來替換的程式如下(StringVector.java):

public class StringVector {
	private String[] data;
	private int count;

	public StringVector() {
		this(10); // default size is 10
	}

	public StringVector(int initialSize) {
		data = new String[initialSize];
	}

	public void add(String str) {
		// ignore null strings
		if (str == null) {
			return;
		}
		ensureCapacity(count + 1);
		data[count++] = str;
	}

	private void ensureCapacity(int minCapacity) {
		int oldCapacity = data.length;
		if (minCapacity > oldCapacity) {
			String oldData[] = data;
			int newCapacity = oldCapacity * 2;
			data = new String[newCapacity];
			System.arraycopy(oldData, 0, data, 0, count);
		}
	}

	public void remove(String str) {
		if (str == null) {
			return; // ignore null str

		}
		for (int i = 0; i < count; i++) {
			// check for a match
			if (data[i].equals(str)) {
				System.arraycopy(data, i + 1, data, i, count - 1); // copy data
				// allow previously valid array element be gc'd
				data[--count] = null;
				return;
			}
		}
	}

	public final String getStringAt(int index) {
		if (index < 0) {
			return null;
		} else if (index > count) {
			return null; // index is > # strings
		} else {
			return data[index]; // index is good }
		}
	}
}
           

是以,代碼:

                           Vector Strings=new Vector(); 

                           Strings.add(“One”);

                           Strings.add(“Two”);

                           String Second=(String)Strings.elementAt(1);

可以用如下的代碼替換:

                          StringVector Strings=new StringVector();

                          Strings.add(“One”);

                          Strings.add(“Two”);

                          String Second=Strings.getStringAt(1); 

這樣就可以通過優化線程來提高JAVA程式的性能。用于測試的程式如下(TestCollection.java): 

import java.util.Vector;

public class TestCollection {
	public static void main(String[] args) {
		TestCollection collect = new TestCollection();
		collect.main1("stringvector");
	}
	public  void main1(String ...args) {
		if (args.length == 0) {
			System.out
					.println("Usage: java TestCollection [ vector | stringvector ]");
			System.exit(1);
		}
		if (args[0].equals("vector")) {
			Vector store = new Vector();
		
			long start = System.currentTimeMillis();
			for (int i = 0; i < 1000000; i++) {
				store.addElement("string");
			}
			long finish = System.currentTimeMillis();
			System.out.println((finish - start));
			start = System.currentTimeMillis();
			for (int i = 0; i < 1000000; i++) {
				String result = (String) store.elementAt(i);
			}
			finish = System.currentTimeMillis();
			System.out.println((finish - start));
		} else if (args[0].equals("stringvector")) {
			StringVector store = new StringVector();
			long start = System.currentTimeMillis();
			for (int i = 0; i < 1000000; i++) {
				store.add("string");
			}
			long finish = System.currentTimeMillis();
			System.out.println((finish - start));
			start = System.currentTimeMillis();
			for (int i = 0; i < 1000000; i++) {
				String result = store.getStringAt(i);
			}
			finish = System.currentTimeMillis();
			System.out.println((finish - start));
		}
	}
}
           

測試的結果如下(假設标準的時間為1,越小性能越好):

繼續閱讀