在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}

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

5list         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          set23819

1k      loop      99     10k        loop1526

1k      binarySearch  12      10k      binarySearch   12

总结

参照这个表格,结论已经很明显了。最简单的Loop方法比其他任何使用集合容器的方法都更加高效。

很多的开源项目代码显示,很多Java开发者喜欢使用第一种方法(list),实际上,该方法的性能并不好。

该方法把一个数组的元素转移到一个新的集合容器中,显然,在所有的元素转移完成之前,新的集合容器处于不可用的状态。

该表格还反映出一个事实:Arrays.binarySearch()方法的性能是最好的,特别是对于数组长度很大的数组。

但是该方法要求数组必须有序,这限制住了该方法的使用场景,本文实例代码中的数组并不是有序的,

所以不应该使用该方法。

实际上,如果你确实需要高效地检查某个特定值是否被包含在某些数组或者集合容器中,

你应该考虑使用有序列表或有序树,这些集合容器查找特定值的时间复杂度是 O(log(n))。

当然,如果使用哈希集合,时间复杂度下降为 O(1)。

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

  1. datatables 树形表格 java数据组装_实学:Java开发自己的博客系统-第三十篇(后台添加栏目功能-4)...

    上一节已经显示了表格内容.读者玩有些网站的话,会发现很多表格有排序.分页.搜索功能,我们这一节先来做以下这些,因为如果导入一个库:DataTables,那么这些事情都是简单到你无法想象的事情. 跟我来 ...

  2. java 数据权限_通用数据权限的思考与设计

    1.数据权限概述 1.1.什么是数据权限? 如果想学习Java工程化.高性能及分布式.深入浅出.微服务.Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:7877071 ...

  3. java 数据对_数据表与简单java类(一对多)

    emp表:empno,ename,job,sal,comm,mgr,deptno dept表:deptno,dname,loc 要求可以通过程序描述出如下对应关系 一个部门有多个部员,并且可以输出一个 ...

  4. java 序列化 文件_一种恢复Java序列化文件数据的方法与流程

    本发明涉及信息安全技术领域,特别涉及一种恢复Java序列化文件数据的方法. 背景技术: 在数据解析恢复领域经常会遇到序列化文件的解析.Java序列化是Java 自身提供的一种数据序列化方式,它允许开发 ...

  5. java contains 效率_字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match)...

    通常情况下,我们判断一个字符串中是否存在某值常常会用string.contains,其实判断一个字符串中存在某值的方法有很多种,最常用的就是前述所说的string.contains,相对来说比较常用的 ...

  6. java indexof方法_【3-14】Java中集合类list的增删改查

    Hello,大家好,我是大家最亲爱的siki老师,每天都会在这里为大家带来一个Java语法中有趣的知识点,Q群175158287,欢迎同大家多多交流哈! 今天给大家带来的是Java中list类的使用, ...

  7. 链表 java详解_链表详解——Java版

    什么是链表? 链表是一个线性结构,但是存储的数据可以是非线性的.链表由一个个子节点构成,每个节点有两个部分:数据域和指针域,数据域就是实际存储数据的,指针域可以有一个和两个,单链表就是单个指针域指向后 ...

  8. java 编译器原理_作业5:Java编译原理

    零.编译 1.编译器 (1)前端编译器:.java文件转变为.class文件Sun的javacEclipse JDT中的增量编译器(ECJ) (2)后端编译器:.class文件转变为机器码HotSpo ...

  9. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

最新文章

  1. StatQuest-对RNA-seq的介绍
  2. linux的FHS文件系统目录介绍
  3. FM IPRO - GET_ADDIN_SCHEMA
  4. 结合“性能监视器” 排查、处理性能瓶颈导致应用吞吐率等指标上不去的问题...
  5. 心理与行为科学统计_华东师范大学心理学考研备考经验分享
  6. Linux系统是什么
  7. 获取当前时间getDate()注意点
  8. iptables常用
  9. 生命计算机在线,生命计算器
  10. c语言全局变量(c语言全局变量怎么定义)
  11. Oxygen XML Editor(XML编辑器)v21.0专业破解版
  12. 作业5:链家.csv
  13. 幼儿园故事导入语案例_幼儿园故事教案导入语
  14. .NET跨平台:在CentOS上编译dnx并运行ASP.NET 5示例程序
  15. 任务教学法在计算机教学,“任务驱动”教学法在计算机基础教学中的应用
  16. 论文总结:基于可编辑区块链的工业物联网数据管理机制
  17. ZYNQ裸板:DDR篇
  18. 杨百万建议:炒股操作
  19. 数据库 | MySQL 5.7 安装教程及卸载教程【附安装包】
  20. 色选机工作原理与工作流程详解

热门文章

  1. C#学习笔记——软件注册与注册机
  2. HDU-2072 单词数 水题一枚
  3. 多线程都调用一个函数,在这个函数中的一个局部变量什么情况会被修改
  4. php xml 格式化,php简单处理XML数据的方法示例
  5. shell date 日期格式化_抖音短视频系统开发,日期加减
  6. java 高并发第三阶段实战_Java 高并发第三阶段实战---Java并发包深入解析与使用详解...
  7. myeclipse springboot 运行内存溢出_springboot学习心得 - aowumao
  8. 表单校验方式(手机号,固定电话,邮箱,营业执照,银行卡号)
  9. nginx输出日志_ingressnginx持久化日志
  10. 怎么解除airpods定位_华强北airpods