日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java中怎么表示数组中的某个值_简易Java(12):如何高效检查一个数组中是否包含某个值?...

發布時間:2023/12/15 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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):如何高效检查一个数组中是否包含某个值?...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。