如何高效判断java数组是否包含某个值
在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)。
如何高效判断java数组是否包含某个值的更多相关文章
- 判断Java数组是否包含某个值
下面给出四种方式,其中最有效率的还是loop方式,有兴趣的话可以测试一下: 代码如下: public boolean findStr(String[] args,String str){ boolea ...
- JS 判断一个数组是否包含某个值
如下判断: return arrValues.indexOf('Sam') > -1
- 【MongoDB】查询字段对应的数组中包含某个值
在MongoDB操作的时候,我们可能会遇到查询[字段对应的数组中包含某个值]的数据,查询语句如下,假设表名为user. 示例1 数据 { id: 1, state_arr: [ "123&q ...
- 怎样高效地去判断Array中是否包含某个值?
问题 怎样去判断Array(无序)中是否包含某个值呢? 这是一个在Java中经常被问到的问题.它也是Stack Overflow上投票前几的一个问题.下面将展示投票前几的几个回答,这些回答使用不同的方 ...
- Java数组,去掉重复值、增加、删除数组元素
import java.util.List; import java.util.ArrayList; import java.util.Set; import java.util.HashSet; p ...
- java 数组中求最值
java中数组求最值,这在实际的开发中差点儿用不到,可是在面试中会偶尔被问到,这是考你主要的思维能力,如今说下这个题的基本思路 思路: 1:先定义一个变量,通常是用数组的第一个值 2:在循环中推断(从 ...
- 七、如何在Java中高效检查一个数组是否含有一个值
如何检查一个数组(非排序的)是否包含特定的值.这是个非常有用或经常被在Java中使用.这是个在Stack Overflow中高得票的问题.在已经高得票的答案中,有许多不同的处理方法,但是时间的复杂度非 ...
- js判断一个数组是否包含一个指定的值
今天看了一下 有好几种方法 总结一下 1:array.indexOf 此方法判断数组中是否存在某个值,如果存在返回数组元素的下标,否则返回-1 let arr = ['something', ...
- 判断js中数组是否包含某值
可以用数组的includes函数判断数组中是否存在某个值.
随机推荐
- 服务器端FIN的条件
服务器端FIN的条件_域名/网络_常见问题_对象存储 OSS-阿里云 https://help.aliyun.com/knowledge_detail/65427.html 服务器端FIN的条件 KB ...
- debug $mysqli->character_set_name();
<?php $mysqli = new mysqli('localhost', 'root', '', 'w'); if(mysqli_connect_errno()){ printf('Con ...
- python中执行shell命令行read结果
+++++++++++++++++++++++++++++ python执行shell命令1 os.system 可以返回运行shell命令状态,同时会在终端输出运行结果 例如 ipython中运行如 ...
- android动态设置边框颜色
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...
- 在系统启动时,Windows Vista 中、 在 Windows 7 中,Windows Server 2008 中和在 Windows Server 2008 R2 中的 497 天后未关闭 TIME_WAIT 状态的所有 TCP/IP 端口
在系统启动时,Windows Vista 中. 在 Windows 7 中,Windows Server 2008 中和在 Windows Server 2008 R2 中的 497 天后未关闭 TI ...
- python 根据路径导入模块
Import python module NOT on path http://stackoverflow.com/questions/10161568/import-python-module-no ...
- [LeetCode] 549. Binary Tree Longest Consecutive Sequence II_ Medium tag: DFS recursive
Given a binary tree, you need to find the length of Longest Consecutive Path in Binary Tree. Especia ...
- QLabel 文本内容自动换行显示
需要把QLabel的WordWrap属性设置成TRUE,可以通过界面设置,也可以通过程序设置
- volatile的语义与实现
1.volatile关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修 ...
- 020-安装centos6.5后的生命历程
01.配置网络.修改了ifcfg-eth0文件内容. 1)ifcfg-eth0原来的内容如下: 2)ifcfg-eth0配置后的内容如下: 3)然后重启网络服务: 4)测试网络是否可通: 5)查看 ...