java中怎么表示数组中的某个值_简易Java(12):如何高效检查一个数组中是否包含某个值?...
如何檢查一個數組(未排序)中是否包含某個特定的值?在Java中,這是一個非常有用并又很常用的操作。同時,在StackOverflow中,有時一個得票非常高的問題。在得票比較高的幾個回答中,時間復雜度差別也很大。在下面的例子中,D瓜哥將展示每個方法花費的時間。
1、不同的實現方式
1) 使用List:
1/**
3*/
4
5public static boolean useList(String[] arr, String targetValue) {
6return Arrays.asList(arr).contains(targetValue);
7}
2) 使用Set:
1/**
3*/
4
5public static boolean useSet(String[] arr, String targetValue) {
6Set set =new HashSet(Arrays.asList(arr));
7return set.contains(targetValue);
8}
3) 使用循環:
01/**
03*/
04
05public static boolean useLoop(String[] arr, String targetValue) {
06for (String s : arr) {
07if (s.equals(targetValue)) {
08return true;
09}
10}
11return false;
12}
4) 使用Arrays.binarySearch:
下面的代碼是錯誤。但是,為了這個回答的完整性,還是將其列在這里。binarySearch()方法僅能用于已排序的數組。不過,你將會被下面的結果所震驚。
01/**
03*/
04
05public static boolean useArraysBinarySearch(String[] arr, String targetValue) {
06int a = Arrays.binarySearch(arr, targetValue);
07if (a >0) {
08return true;
09}else {
10return false;
11}
12}
2、時間復雜度
使用如下代碼來粗略比較不同實現間的時間復雜度。雖然不是很精確,但是思路確實正確的。我們將看看數組在有5、1k、10k個元素的情況下的不同表現。
01/**
03*/
04
05public static void main(String[] args) {
06String[] arr =new String[]{"CD","BC","EF","DE","AB"};
07
08// use list
09long startTime = System.nanoTime();
10for (int i =0; i <100000; i++) {
11useList(arr,"A");
12}
13long endTime = System.nanoTime();
14long duration = endTime - startTime;
15System.out.println("useList:? " + duration /1000000);
16
17// use set
18startTime = System.nanoTime();
19for (int i =0; i <100000; i++) {
20useSet(arr,"A");
21}
22endTime = System.nanoTime();
23duration = endTime - startTime;
24System.out.println("useSet:? " + duration /1000000);
25
26// use loop
27startTime = System.nanoTime();
28for (int i =0; i <100000; i++) {
29useLoop(arr,"A");
30}
31endTime = System.nanoTime();
32duration = endTime - startTime;
33System.out.println("useLoop:? " + duration /1000000);
34
35// use Arrays . binarySearch ()
36startTime = System.nanoTime();
37for (int i =0; i <100000; i++) {
38useArraysBinarySearch(arr,"A");
39}
40endTime = System.nanoTime();
41duration = endTime - startTime;
42System.out.println("useArrayBinary:? " + duration /1000000);
43}
結果:
1useList:12
2useSet:65
3useLoop:2
4useArrayBinary:7
使用大一點的數組(1k個元素):
01/**
03*/
04
05int length =1000;
06String[] arr =new String[length];
07
08Random s =new Random();
09for (int i =0; i < length; i++) {
10arr[i] = String.valueOf(s.nextInt());
11}
結果:
1useList:115
2useSet:2010
3useLoop:97
4useArrayBinary:9
使用更大一點的元素(10k個元素):
01/**
03*/
04
05int length =10000;
06String[] arr =new String[length];
07
08Random s =new Random();
09for (int i =0; i < length; i++) {
10arr[i] = String.valueOf(s.nextInt());
11}
結果:
1useList:1678
2useSet:25609
3useLoop:1802
4useArrayBinary:10
D瓜哥注:
以下內容是安裝原文翻譯過來的。但是,從上面的結果來看,實際的表現和文章內容不太一樣,D瓜哥自己的推斷和文章介紹的是一樣的。但是,實際測試的結果卻截然不同。但是,至于為什么會出現這種問題,還需要進一步研究。
從上面的結果可以清晰看到,使用簡單循環的相比使用其他集合操作更高效。很多很多開發人員使用第一種方法,但是它并不是最高效的。將數組轉化成其他的任何集合類型都需要先將所有元素讀取到集合類中,才能對這個集合類型做其他的事情。
當使用Arrays.binarySearch()方法時,數組必須是排好序的。如果數組不是排好序的,則不能使用這個方法。
事實上,如果你真的需要高效地檢查一個數組或者集合中是否包含一個值,一個排好序的數組或者樹可以達到O(log(n))的時間復雜度,HashSet甚至能達到O(1)的時間復雜度。
《Simple Java》是一本講解Java面試題的書。講解也有不少獨特之處,為了面試,《簡易Java》走起!
如果感覺這篇文章不錯,請點擊這里的分享按鈕,分享到微博等地方去,讓更多人受益!
您的支持是D瓜哥最大的寫作動力!謝謝!
總結
以上是生活随笔為你收集整理的java中怎么表示数组中的某个值_简易Java(12):如何高效检查一个数组中是否包含某个值?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS内存泄漏检测及分析
- 下一篇: jpane1_Java—面板组件(Jpa