使用不同方法查詢陣列中某個特定值(物件),並計算時間(個人練習)

raylu666發表於2017-04-15

設計了幾種遍歷方式,來看那種最快,先來看結果,後面附有實現方式,後續寫程式碼可根據需求選擇哪種方式

陣列長度小於1000時,使用自定義Loop最快; 陣列長度很大時,使用Arrays.binarySearch()速度最快.

第一種陣列長度10000,  總評價:Arrays.binarySearch()速度最快,其次是自定義Loop(不穩定),List速度不如Set

執行第一次:

使用Loop查詢花費的時間為183040
使用Arrays.binarySearch()查詢花費的時間為36693
使用UseList查詢花費的時間為187733

使用UseSet查詢花費的時間為150187

執行第二次:

使用Loop查詢花費的時間為93013
使用Arrays.binarySearch()查詢花費的時間為35840
使用UseList查詢花費的時間為283307
使用UseSet查詢花費的時間為272640


第二種陣列長度1000000,總評價:Arrays.binarySearch()速度最快,Loop最慢,List速度不如Set

執行第一次;

使用Loop查詢花費的時間為4436905
使用Arrays.binarySearch()查詢花費的時間為33707
使用UseList查詢花費的時間為193280
使用UseSet查詢花費的時間為149760

執行第二次:

使用Loop查詢花費的時間為4009812
使用Arrays.binarySearch()查詢花費的時間為34133
使用UseList查詢花費的時間為185600
使用UseSet查詢花費的時間為144640

第三種陣列長度1000, 總評價: Loop最快,其次是Arrays.binarySearch(); List速度不如Set

執行第一次:

使用Loop查詢花費的時間為20907
使用Arrays.binarySearch()查詢花費的時間為49494
使用UseList查詢花費的時間為200533
使用UseSet查詢花費的時間為247040

執行第二次:

使用Loop查詢花費的時間為27734
使用Arrays.binarySearch()查詢花費的時間為53334
使用UseList查詢花費的時間為303360
使用UseSet查詢花費的時間為269227

附上測試程式碼:

package test1;

//在陣列中查詢某個特定值,如何查詢最快?測試看看。。
//如何在陣列中找出某個特定值,並計算執行時間
public class TestQuery1 {
	public static void main(String[] args) {
		//定義一個含有10000個數字的陣列
		int[] arr = new int[1000];
		for(int i = 0; i < arr.length; i++){
			arr[i] = (int) (Math.random()*1000);
		}
		
		//假設查詢數字666
		int targetValue = 666;
		
		//使用Loop查詢時間
		UseLoop useLoop = new UseLoop(arr, targetValue);
		useLoop.spendTime("Loop");
		
		//使用Arrays.binarySearch()方法查詢
		UseArraysBinary  useAB = new UseArraysBinary(arr, targetValue);
		useAB.spendTime("Arrays.binarySearch()");

		//使用集合List查詢
		UseList useList = new UseList(arr, targetValue);
		useList.spendTime("UseList");
		
		//使用集合set查詢
		UseSet useSet = new UseSet(arr, targetValue);
		useSet.spendTime("UseSet");
	}
}

Spend Time抽象類,計算花費時間:

package test1;

public abstract class SpendTime {
	
	protected int[] arr;
	protected int targetValue;
	
	public abstract int search();
	
	public void spendTime(String name){
		long start = System.nanoTime();
		search();
		long end = System.nanoTime();
		long time = end - start;
		System.out.println("使用"+name+"查詢花費的時間為"+time);
	}
}
使用Loop:

package test1;

public class UseLoop extends SpendTime{
//使用Loop查詢陣列是否包含某個值

	public UseLoop(int[] arr, int targetValue){
		this.arr = arr;
		this.targetValue = targetValue;
	}

public int search() {
		for(int i =0; i < arr.length; i++){
			if (arr[i]== targetValue){
				return i;
			}
		}
		return -1;
	}
}

使用Arrays.binarySearch()

package test1;

import java.util.Arrays;

public class UseArraysBinary extends SpendTime{
	public UseArraysBinary(int[] arr, int targetValue){
		this.arr = arr;
		this.targetValue = targetValue;
	}
	//使用Arrays.binarySearch查詢陣列中是否含有特定值
	@Override
	public int search() {
		return Arrays.binarySearch(arr, targetValue);
	}
}
使用List

package test1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class UseList extends SpendTime{

	public UseList(int[] arr, int targetValue){
		this.arr = arr;
		this.targetValue = targetValue;
	}
	
	@Override
	public int search() {
		List list = Arrays.asList(arr);
		if(list.contains(targetValue))
			return 1;
		return -1;
	}
}
使用Set

package test1;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class UseSet extends SpendTime{
	public UseSet(int[] arr, int targetValue){
		this.arr = arr;
		this.targetValue = targetValue;
	}
	@Override
	public int search() {
		Set set = new HashSet(Arrays.asList(arr));
		if(set.contains(targetValue))
			return 1;
		return -1;
	}
}


相關文章