提问:在Java中,如何确定数组是否包含特定值?
我创建了如下一个数组
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
复制代码现在给出一个字符串s,有什么办法来测试数组中是否包含字符串s吗?
回答一
Arrays.asList(yourArray).contains(yourValue)
复制代码Java8以后可以使用Stream
String[] values = {"AB","BC","CD","AE"};
boolean contains = Arrays.stream(values).anyMatch("s"::equals);
复制代码要检查int、double或long数组是否包含值,请分别使用IntStream、DoubleStream或LongStream。
int[] a = {1,2,3,4};
boolean contains = IntStream.of(a).anyMatch(x -> x == 4);
复制代码回答二
- 写个简单的工具方法
public static <T> boolean contains(final T[] array, final T v) {
    for (final T e : array)
        if (e == v || v != null && v.equals(e))
            return true;
    return false;
}
复制代码- 升级版
v != null在方法中是固定不变的,它总是计算为相同的布尔值。因此,如果输入数组很大,则只计算一次更有效,并且我们可以根据结果在for循环中使用简化/更快的条件。改进的contains()方法:
public static <T> boolean contains2(final T[] array, final T v) {
    if (v == null) {
        for (final T e : array)
            if (e == null)
                return true;
    } 
    else {
        for (final T e : array)
            if (e == v || v.equals(e))
                return true;
    }
    return false;
}
复制代码回答三
值得一提的是,我做了一个测试,比较累3个关于速度的建议。我生成了随机整数,将它们转换成字符串并将它们添加到数组中。然后我搜索了可能的最大数字/字符串,这对于asList().contains()来说是最坏的情况。
当使用一个10K大小的数组,结果是:
Sort & Search   : 15
Binary Search   : 0
asList.contains : 0
复制代码当使用一个100K大小的数组,结果是:
Sort & Search   : 156
Binary Search   : 0
asList.contains : 32
复制代码因此,如果数组是按顺序创建的,那么二进制搜索是最快的,否则asList()就是最好的选择。如果对这个数组有许多搜索,那么对数组先排个序是值得的。
我想这是大多数仁期望的结果。下面是测试代码。
import java.util.*;
public class Test
{
    public static void main(String args[])
    {
        long start = 0;
        int size = 100000;
        String[] strings = new String[size];
        Random random = new Random();
        for (int i = 0; i < size; i++)
            strings[i] = "" + random.nextInt( size );
        start = System.currentTimeMillis();
        Arrays.sort(strings);
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Sort & Search : " + (System.currentTimeMillis() - start));
        start = System.currentTimeMillis();
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Search        : " + (System.currentTimeMillis() - start));
        start = System.currentTimeMillis();
        System.out.println(Arrays.asList(strings).contains( "" + (size - 1) ));
        System.out.println("Contains      : " + (System.currentTimeMillis() - start));
    }
}
复制代码文章翻译自Stack Overflow:stackoverflow.com/questions/2…
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
    






















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)
