检查String是否等于任何给定的字符串集

时间:2018-01-30 09:16:49

标签: java string

有两种方法可以检查传入请求是PRIV还是private static final String PRIV = "PRIV"; private static final String PUB = "PUB"; ... String request = ...; if(PRIV.equals(request) || PUB.equals(request)) { ... } 类型。

第一

private static final String PRIV = "PRIV";
private static final String PUB = "PUB";
...
String request = ...;
if(Arrays.asList(PRIV, PUB).contains(request)) {
    ...
}

第二

if(PRIV.equals(request) || PUB.equals(request) || ...){
    ...
}

我比第一种方式更喜欢第二种方式。

第二种情况 性能增益/降低 是什么?

更新

猜猜我无法正确构建问题。

我只是想知道传统的方法

private static final List<String> VALUES = Collections.unmodifiableList(Arrays.asList(PRIV, PUB));
if(VALUES.contains(request)) {
    ...
}

无论如何更好/更差而不是

[[UIApplicationsharedApplication]setApplicationIconBadgeNumber:0];

6 个答案:

答案 0 :(得分:2)

第一个选项的问题在于它(或将会)非常详细。

第二个选项的问题在于您要为每个请求创建列表。

还有第3个选项,您可以在其中创建列表ONLY ONCE并将其设为static unmodifiableList,如下所示,然后检查列表中是否存在值:

    private static final String PRIV = "PRIV";
    private static final String PUB = "PUB";

    private static final List<String> values = 
           Collections.unmodifiableList(Arrays.asList(new String[]{PRIV,PUB})); 

    public static void main(String[] agrs) {
        if(values.contains(request)) {
            //do something here
        }
    }

答案 1 :(得分:1)

您可以通过创建Set<String>代替List<String>来获得更好的性能,使用List,您的性能为O(n),并将其设置为O(1)。因此,在类的静态初始值设定项中创建一个最终的静态不可修改的字符串集,然后使用set.contains(request)来提供最佳性能 - 优于List。但是,如果你的字符串数量很小,那么性能增益是可以忽略不计的。

答案 2 :(得分:0)

在这两种情况下,您都在进行更精简的搜索,因此时间复杂度为O(N)。所以理论上两者都是一样的。

但是在第一种情况下,您直接将字符串与其他字符串进行比较而没有任何额外的重载。但在第二种情况Arrays.asList(PRIV, PUB)中,它将创建ArrayList,因此需要更多内存和更多CPU能力。另外ArrayList.contain搜索项目的线性模式为O(N)。

最后在第一种情况下需要O(N) time,在第二种情况下需要O(N) + extra time and memory to create ArrayList。所以first case is absolutely good for performance

答案 3 :(得分:0)

以下是Java Microbenchmark Harness(JMH)基准测试结果:

字符串请求=“abc”;

Benchmark               Mode  Cnt   Score    Error  Units
MyBenchmark.testFirst   avgt   25   9.408 ±  4.797  ns/op
MyBenchmark.testSecond  avgt   25  40.871 ± 14.343  ns/op

字符串请求=“PRIV”;

Benchmark               Mode  Cnt      Score       Error  Units
MyBenchmark.testFirst   avgt   25  39941.986 ± 10612.569  ns/op
MyBenchmark.testSecond  avgt   25  41034.244 ± 12146.154  ns/op

正如您所看到的那样,第二种情况比第一种情况<<>> >

当集合中存在请求值时,两种情况的表现大致相同

答案 4 :(得分:0)

当您使用第一种方法 string.equals(String object)时,如果有以下情况,它会在 O(1)的时间复杂度范围内运行:

  1. 找到匹配,
  2. 长度不同,因此不相等。
  3. 当方法必须遍历每个字符以检查它们是否相等时,

    O(n)

    但是当你使用List.contains(String object)方法时,会做两件事:

    1. 一次挑选每个元素,直到找到匹配为止。
    2. 在内部执行equals()方法以检查它与输入的相等性,这又需要时间,如第一种方法所述。
    3. 参考:Oracle Docs: List

      因此得出结论,当使用string.equals(String obj)方法时,我们直接进行相等性检查,但在使用List.contains(String object)方法时,我们将进行一个额外的步骤。

      这表明为什么第一种方法更快。

答案 5 :(得分:-3)

很容易知道。

请在下面的课程中执行。

import java.util.Arrays;

public class StringTest {
private static final String PRIV = "PRIV";
private static final String PUB = "PUB";

public static void main(String[] args) {

    long startTime = System.nanoTime();
    String request = "PRIV";
    if (request.equals(PRIV) || request.equals(PUB)) {
        System.out.println("----");
    }
    long stopTime = System.nanoTime();
    System.out.println(stopTime - startTime);



    long startTime1 = System.nanoTime();
    String request1 = "PRIV";
    if (Arrays.asList(PRIV, PUB).contains(request1)) {
        System.out.println("----");
    }
    long stopTime1 = System.nanoTime();
    System.out.println(stopTime1 - startTime1);
}
}

输出:

203100

224100

执行字符串比较比该数组更快。每次执行中的值可能会有所不同,但字符串执行值会更低