在java中,我们如何判断一个未排序数组中是否包含一个特定的值?这在java中是一个频繁非常实用的操作。那么什么样的方法才是最高效的方式?当然

,这个问题在Stack Overflow也是得票率非常高的一个问答。得票率排在最前的几个答案给出集中不同的方法,但是他们的时间复杂度却相差甚远。
本文将详细的探讨主流的方法,并给出他们各自的时间损耗。
四种方法
List
public static boolean useList(String[] arr,String value){
return Arrays.asList(arr).contains(value);
}
Set
public static boolean useSet(String[] arr,String value){
return sets.contains(value)
}
loop
public static boolean useLoop(String[] arr,String value){
for(String s:arr){
if(s.equals(value))
return true;
}
return false;
}
binarySearch
public static boolean useBinarySearch(String[] arr,String value){
int result=Arrays.binarySearch(arr,value);
if(result>0)
return true;
else
return false;
}
此方法是不正确的,因为Arrays的binarySearch方法必须应用于有序数组。
性能对比
如果读者熟悉以上java代码片段中出现的集中数据结构,那么可以利用时间复杂度计算标准,
先推算这四种方式的性能对比的大致结果。当然,我们这里不采用这种方式,而是直接运用
如下测试代码对比这四种方式的时间损耗情况。为了使得我们的测试结果更具有代表性,我们
针对不同的数据量做了多组测试。也许,这个测量方式并不精确,但是测量结果是清晰和可
信任的。测试的示例代码如下:
public static void main(String[] args) {

String[] arr = new String[] { “www.”, “tiantian”, “bian”, “ma”, “.com”};

long startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
// use list
useList(arr, “天天编码”);
// use set
//useSet(arr, “天天编码”);
// use loop
//useLoop(arr, “天天编码”);
// use binarySearch
//useBinarySearch(arr, “天天编码”);
long endTime = System.nanoTime();
long duration = endTime = startTime;
System.out.pri}

数组长度     方法       运行耗时      数组长度     方法       运行耗时

5          list          13        100              list         50

5         set        72       100       set         668
5         loop       5        100        loop          47
5          binarySearch   100      inarySearch    8
1k        list         112       10k        list       1590
1k       set         2055      10k          set 23819
1k        loop        99       10k         loop 1526
1k       binarySearch   12       10k        binarySearch   12
总结
参照这个表格,结论已经很明显了。最简单的Loop方法比其他任何使用集合容器的方法都更加高效。
很多的开源项目代码显示,很多Java开发者喜欢使用第一种方法(list),实际上,该方法的性能并不好。
该方法把一个数组的元素转移到一个新的集合容器中,显然,在所有的元素转移完成之前,新的集合容器处于不可用的状态。

该表格还反映出一个事实:Arrays.binarySearch()方法的性能是最好的,特别是对于数组长度很大的数组。
但是该方法要求数组必须有序,这限制住了该方法的使用场景,本文实例代码中的数组并不是有序的,
所以不应该使用该方法。

实际上,如果你确实需要高效地检查某个特定值是否被包含在某些数组或者集合容器中,
你应该考虑使用有序列表或有序树,这些集合容器查找特定值的时间复杂度是 O(log(n))。
当然,如果使用哈希集合,时间复杂度下降为 O(1)。

转载于:https://www.cnblogs.com/congcong1024/p/7908395.html

如何高效判断java数组是否包含某个值相关推荐

  1. java 数据包含_如何高效判断java数组是否包含某个值

    在java中,我们如何判断一个未排序数组中是否包含一个特定的值?这在java中是一个频繁非常实用的操作.那么什么样的方法才是最高效的方式?当然 ,这个问题在Stack Overflow也是得票率非常高 ...

  2. java数组包含某个值_如何检查Java数组是否包含值?

    java数组包含某个值 如何检查Java数组是否包含值? (How to Check if Java Array Contains a Value?) There are many ways to c ...

  3. java数组是否包含某字符串_js判断数组是否包含某个字符串变量的实例

    最近碰到一个这样的现象,后台返回的数据中,数组里面有一些有变量值,有一些没有变量值. 举个例子,比如后台返回的例子是这样的: var arr=[ { "status":" ...

  4. java数组可以包含对象吗_数组可以包含对象类型的元素吗_对象数组

    对象数组就是数组里的每个元素都是类的对象,赋值时先定义对象,然后将对象直接赋给数组就行了. 怎样声明包含 5 个元素的对象数组,每个元素都是 Employee 类型的对象 浏览次数:4875 bill ...

  5. java数组中包含元素_Java中声明数组时,包括数组的名字、数组中包含的元素的 。 (5.0分)_学小易找答案...

    [简答题]3,单冲压片机的安装程序? [判断题]continue语句只用于循环语句中,它起到终止本次循环,返回到循环开始处的作用. (5.0分) [判断题]default在switch选择结构中是必需 ...

  6. 6种JavaScript判断数组是否包含某个值的方法

    我们在项目开发过程中,经常会要检查一个数组(无序)是否包含一个特定的值?这是一个在JavaScript中经常用到的并且非常有用的操作. 下面给出几种实现方式. 方式一:利用循环 这种方式是比较老的实现 ...

  7. 检查数组是否包含某个值

    //使用list判断是否包含目标值 public class isListContains { //数组转换成list判断,一个元素是否存在于list集合之后     public static vo ...

  8. Java数组中的最值

    求出数组中的最值 public class Demo06ArrayMin {     public static void main(String[] args) {         int[] ar ...

  9. Java数组作为方法返回值

    // 数组作为方法返回值 一个方法可以有0.1.多个参数:但是只能有0或者1个返回值. 如果希望一个方法当中产生了多个结果数据进行返回, 使用一个数组作为返回值类型即可. 任何数据类型都能作为方法的参 ...

最新文章

  1. codefore 213 C Relay Race (朴素DP)
  2. 2016宁波计算机程序复赛,宁波第31届中小学生计算机程序设计竞赛复赛试题小学组.PDF...
  3. 作者:高翔(1984-),男,国防大学信息作战与指挥训练教研部博士后,主要研究方向为体系分析与超网建模。...
  4. 飞秋的不定长度字符串处理方法
  5. Ubuntu16.04+Cuda8.0+cuDNN6配置py-faster rcnn(转)
  6. eclipse写javaee的时候js文件新增函数找不到
  7. Java Web九大内置对象及四大域对象
  8. pythonQQ连连看秒杀脚本
  9. 笔记本电脑清灰打硅脂后,开机一直黑屏,如何破?
  10. OpenCV-Python教程
  11. 什么是数字孪生技术?
  12. Matlab--函数与子函数
  13. 程序员跳槽频繁不稳定被质疑,一番话后HR哑口无言!
  14. 经典Java面试题-Java中Char类型的运算
  15. JavaWeb HTML
  16. 五千来字小作文,是的,我们是有个HTTP。
  17. 安装MySql时初始化 MySQL 数据库失败的几个总结
  18. 掩码、反掩码和通配符
  19. bitwarden_rs 搭建自托管的密码服务器
  20. 三角形用代码实现,三角形实现原理。

热门文章

  1. 比特大爆炸为啥老显示服务器满,《有可能是史上最长停服维护公告》
  2. windows下python 自动截图功能
  3. oracle_exporter安装配置,node_exporter安装和配置
  4. oracle性能优化求生指南_Vue项目性能优化--实践指南,网上最全最详细
  5. html table 向上滚动,决策报表的表格自动向上滚动问题
  6. 起泡排序算法_气泡排序算法
  7. scala unix时间戳_下载,在Linux,Unix,Windows上安装Scala
  8. java web 教程_Java Web服务教程
  9. okhttp 示例_OkHttp Android示例教程
  10. log4j.properties文件中的log4j.rootLogger重要性