问题

怎样去判断Array(无序)中是否包含某个值呢?

这是一个在Java中经常被问到的问题。它也是Stack Overflow上投票前几的一个问题。下面将展示投票前几的几个回答,这些回答使用不同的方式解决了这个问题,但是,时间复杂度也是各有不同的。

四种解决方法

使用List

  1. public static boolean useList(String[] arr, String targetValue) {
  2. return Arrays.asList(arr).contains(targetValue);
  3. }

使用Set

  1. public static boolean useSet(String[] arr, String targetValue) {
  2. Set<String> set = new HashSet<String>(Arrays.asList(arr));
  3. return set.contains(targetValue);
  4. }

使用Loop

  1. public static boolean useLoop(String[] arr, String targetValue) {
  2. for (String s : arr) {
  3. if (s.equals(targetValue))
  4. return true;
  5. }
  6. return false;
  7. }

使用ArraysBinarySearch,这个方法只适用于已排序的Array

  1. public static boolean useArraysBinarySearch(String[] arr, String targetValue) {
  2. int a = Arrays.binarySearch(arr, targetValue);
  3. if (a > 0)
  4. return true;
  5. else
  6. return false;
  7. }

时间复杂度

这大概的运行时间可以通过下面的代码进行衡量。这基本的思路是通过在大小分别为5,1k,10k的Array中进行查找。这个方法可能不够精确,但是这个思路还是很简单清晰的。

注:测试环境为win7-64+JDK1.6

使用Array大小为5

  1. public static void main(String[] args) {
  2. System.out.println("---------array size is 5-----------");
  3. String[] arr = new String[] { "CD", "BC", "EF", "DE", "AB" };
  4. //use list
  5. long startTime = System.nanoTime();
  6. for (int i = 0; i < 100000; i++) {
  7. useList(arr, "A");
  8. }
  9. long endTime = System.nanoTime();
  10. long duration = endTime - startTime;
  11. System.out.println("useList: " + duration / 1000000+" 毫秒");
  12. //use set
  13. startTime = System.nanoTime();
  14. for (int i = 0; i < 100000; i++) {
  15. useSet(arr, "A");
  16. }
  17. endTime = System.nanoTime();
  18. duration = endTime - startTime;
  19. System.out.println("useSet: " + duration / 1000000+" 毫秒");
  20. //use loop
  21. startTime = System.nanoTime();
  22. for (int i = 0; i < 100000; i++) {
  23. useLoop(arr, "A");
  24. }
  25. endTime = System.nanoTime();
  26. duration = endTime - startTime;
  27. System.out.println("useLoop: " + duration / 1000000+" 毫秒");
  28. //use Arrays.binarySearch()
  29. startTime = System.nanoTime();
  30. for (int i = 0; i < 100000; i++) {
  31. useArraysBinarySearch(arr, "A");
  32. }
  33. endTime = System.nanoTime();
  34. duration = endTime - startTime;
  35. System.out.println("useArrayBinary: " + duration / 1000000+" 毫秒");
  36. }

结果:

  1. ---------array size is 5-----------
  2. useList: 10 毫秒
  3. useSet: 66 毫秒
  4. useLoop: 4 毫秒
  5. useArrayBinary: 4 毫秒

### 使用Array大小为1k

  1. System.out.println("---------array size is 1k----------");
  2. String[] arr = new String[1000];
  3. Random s = new Random();
  4. for (int i = 0; i < 1000; i++) {
  5. arr[i] = String.valueOf(s.nextInt());
  6. }

结果:

  1. ---------array size is 1k----------
  2. useList: 762 毫秒
  3. useSet: 7549 毫秒
  4. useLoop: 677 毫秒
  5. useArrayBinary: 14 毫秒

使用Array大小为10k

  1. System.out.println("---------array size is 10k---------");
  2. String[] arr = new String[10000];
  3. Random s = new Random();
  4. for (int i = 0; i < 10000; i++) {
  5. arr[i] = String.valueOf(s.nextInt());
  6. }

结果:

  1. ---------array size is 10k---------
  2. useList: 7395 毫秒
  3. useSet: 126341 毫秒
  4. useLoop: 5776 毫秒
  5. useArrayBinary: 17 毫秒

总结

从测试的结果可以清楚地知道,使用简单的Loop比使用集合操作更加有效 。许多开发者使用List方式,但是那并不高效。把Array放到另一个Collection中需要读取Array中的所有元素,这将花费不少的时间。

使用Arrays.binarySearch()的前提是这Array必须是有序的。

实际上,如果你真正需要高效地去判断Array/Collection中是否包含某个值,一个排序了的List或者Tree的时间复杂度为O(log(n)),或者用HashSet,它的时间复杂度为O(1)。

原文链接:http://www.programcreek.com/2014/04/check-if-array-contains-a-value-java/

翻译:crane-yuan

[ 转载请保留原文出处、译者和译文链接。]

怎样高效地去判断Array中是否包含某个值?的更多相关文章

  1. node js 判断数组中是否包含某个值

    判断数组中是否包含某个值这里有四种方法.用的测试数据: let arr=["a","b","c"]; let arr2={"a&q ...

  2. js判断数组中是否包含某个值

    /** * 判断数组中是否包含某个值 * @param arr 数组 * @param str 值 * @returns {boolean} */ function contains(arr, str ...

  3. Js 判断数组中是否包含某个值

    includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false. JavaScript Array includes() 方法

  4. List containsKey 和Map contains 判断集合中是否包含某个值

    map集合 //1.第一种 HashMap map = new HashMap(); map.put("1", "value1"); map.put(" ...

  5. 161101、在Java中如何高效判断数组中是否包含某个元素

    如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Overflow中也是一个非常热门的问题.在投票比较高的几个答案中给出了几种 ...

  6. 在Java中如何高效的判断数组中是否包含某个元素

    原文出处: hollischuang(@Hollis_Chuang) 如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Ove ...

  7. java中如何高效判断数组中是否包含某个特定的值

    四种不同方式检查数组是否包含某个值 使用List: public static boolean useList(String[] arr, String targetValue) { return A ...

  8. 在Java中如何高效判断数组中是否包含某个元素

    如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Overflow中也是一个非常热门的问题.在投票比较高的几个答案中给出了几种 ...

  9. java中如何高效的判断数组中是否包含某个元素---

    package zaLearnpackage; import org.apache.commons.lang3.ArrayUtils; import java.util.Arrays; import ...

随机推荐

  1. spring中bean配置和bean注入

    1 bean与spring容器的关系 Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载.实例化Bean ...

  2. 创建 iPhone/iOS8 弹出菜单(窗口)

    基本步骤 添加视图:主视图与弹出视图 关联视图 配置弹出视图 编码实现:弹出菜单样式及控制器委托 override func prepareForSegue(segue: UIStoryboardSe ...

  3. SPF 简介

    SPF 简介 摘要: SPF 是发送方策略框架 (Sender Policy Framework) 的缩写,希望能成为一个防伪标准,来防止伪造邮件地址.这篇文章对 SPF 进行了简单介绍,并介绍了它的 ...

  4. 客户端cmd打开mysql,执行插入中文报错或插入中文乱码解决方案

    最近在制作一个安装包,需要安装的时候执行mysql脚本儿,做了一个批处理,但是发现总是执行到 插入中文的时候报错,或者插入中文是乱码. 网上查了好多资料,说是把编码改成GBK什么的,终究还是不成功. ...

  5. tomcat的网站屏蔽IP的方法

    <Host> <Valve className="org.apache.catalina.valves.RemoteAddrValve"  deny=" ...

  6. AppCompat Toolbar控件去掉阴影设置高度

    For Android 5.0, if you want to set it directly into a style use: <item name="android:elevat ...

  7. Unity3D Android手机开发环境配置,可真机发布调试

    此方法配置好,在可以在unity直接发布到手机上,并可以实时调试. 1.配置eclipse环境:首先在官网下载安装包:http://developer.android.com/sdk/index.ht ...

  8. [作业向]tinyhttp web服务器设计及完整代码

    最近看了<HTTP权威指南>和<UNP>有了写一个简单的web服务器的想法,正好这个学期没有什么课,所以就花了一个星期这样写了一个出来,鉴于本人水平有限,如果有什么设计或代码错 ...

  9. 后端码农谈前端(CSS篇)第二课:CSS的5个来源

    0.浏览器默认样式 当你不为html元素设置任何样式时,显示在浏览器上的(比如:<b>元素会显示粗体.<p>元素有纵向margin.<h1>元素字号比<p&g ...

  10. 《编写高质量代码:改善C#程序的157个建议》源码下载

    ==== 目录 前 言第一部分 语言篇第1章 基本语言要素 / 2建议1:正确操作字符串 / 2建议2:使用默认转型方法 / 6建议3:区别对待强制转型与as和is / 9建议4:TryParse比P ...