final String string1 = "somestring1";
for (int i = 0; i < 30; i++) {
final String string2 = "somestring2";
if (string2.equals(string1)) { // Using variable
// do stuff
}
}
for (int i = 0; i < 30; i++) {
final String string2 = "somestring2";
if (string2.equals("somestring1")) { // Not using variable
// do stuff
}
}
其中哪一个会更快?
1)第一个将它保存为变量并使用变量直到循环完成。
2)第二个是每次都会生成一个新的String,不是吗?
这只是一个例子,在我的情况下,毫秒很重要。
提前致谢。
答案 0 :(得分:0)
第一个版本(下面列出的)将执行得更快,因为它只会创建一次String。
final String string1 = "somestring1";
for (int i = 0; i < 30; i++) {
final String string2 = "somestring2";
if (string2.equals(string1)) { // Using variable
// do stuff
}
}
答案 1 :(得分:0)
这两者都是100%相同的。没有区别,甚至没有毫秒。
答案 2 :(得分:0)
最简单的方法是尝试看看会发生什么:
public static void main(String[] args) {
final int numOfTrials = 100000;
long first = 0;
for (int index = 0; index < numOfTrials; index++) {
long start = System.nanoTime();
final String string1 = "somestring1";
for (int i = 0; i < 30; i++) {
final String string2 = "somestring2";
if (string2.equals(string1)) { // Using variable
// do stuff
}
}
first+= (System.nanoTime()-start);
}
long second = 0;
for (int index = 0; index < numOfTrials; index++) {
long start = System.nanoTime();
for (int i = 0; i < 30; i++) {
final String string2 = "somestring2";
if (string2.equals("somestring1")) { // Not using variable
// do stuff
}
}
second+= (System.nanoTime()-start);
}
System.out.println("First : "+(first/numOfTrials)+"ns");
System.out.println("Second : "+second/numOfTrials+"ns");
}
numOfTrials = 10000
输出
First : 139ns
Second : 59ns
JVM中有一个缓存机制,如果已经有一个匹配并且使用现有的字符串对象,JVM将不会创建新的字符串对象。有一些方法可以强制jvm创建新的字符串,如关键字“new”。如果你想深入了解,你可能需要找一篇文章并阅读它。
numOfTrials = 1百万
输出:
First : 42ns
Second : 34ns
numOfTrials = 1亿
输出:
First : 31ns
Second : 31ns