有两种方法可以检查传入请求是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];
答案 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)的时间复杂度范围内运行:
或 O(n)。
但是当你使用List.contains(String object)
方法时,会做两件事:
equals()
方法以检查它与输入的相等性,这又需要时间,如第一种方法所述。因此得出结论,当使用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);
}
}
224100
执行字符串比较比该数组更快。每次执行中的值可能会有所不同,但字符串执行值会更低