Java 对于性能,在循环中临时使用字符串或直接调用字符串是否会对性能产生影响? ArrayList strings=new ArrayList(){{ 添加(“a”); 添加(“b”); 添加(“c”); 添加(“d”); }}; int size=strings.size();
这是我想知道使用哪一个和为什么的部分Java 对于性能,在循环中临时使用字符串或直接调用字符串是否会对性能产生影响? ArrayList strings=new ArrayList(){{ 添加(“a”); 添加(“b”); 添加(“c”); 添加(“d”); }}; int size=strings.size();,java,algorithm,Java,Algorithm,这是我想知道使用哪一个和为什么的部分 ArrayList<String> strings = new ArrayList<String>(){{ add("a"); add("b"); add("c"); add("d"); }}; int size = strings.size(); for(int i=0;i
ArrayList<String> strings = new ArrayList<String>(){{
add("a");
add("b");
add("c");
add("d");
}};
int size = strings.size();
for(int i=0;i
或
for(int i=0;i
这对性能有什么影响吗?
temp\u字符串
是否指向存储在内存的arraylist部分的字符串,或者它是否在每个循环中分配另一个内存空间来保存temp\u字符串
?首先,我相信你指的是字符串的第二个算法。get(I)不是temp\u字符串。get(I)是因为temp\u字符串没有声明
现在说到这里,第一种算法需要更长的时钟周期。请注意,您有所有相同的调用以及分配操作。这在大多数情况下都可以忽略不计,但在高性能环境中可能代价高昂。首先,我相信第二种算法是指字符串。get(I)不是temp_字符串。get(I)因为temp_字符串没有声明
现在说到这里,第一种算法需要更长的时钟周期。请注意,您有所有相同的调用以及分配操作。这在大多数情况下都可以忽略不计,但在高性能环境中可能代价高昂。首先,我相信第二种算法是指字符串。get(I)不是temp_字符串。get(I)因为temp_字符串没有声明
现在说到这里,第一种算法需要更长的时钟周期。请注意,您有所有相同的调用以及分配操作。这在大多数情况下都可以忽略不计,但在高性能环境中可能代价高昂。首先,我相信第二种算法是指字符串。get(I)不是temp_字符串。get(I)因为temp_字符串没有声明
现在说到这里,第一种算法需要更长的时钟周期。请注意,您有所有相同的调用以及分配操作。在大多数情况下,这一点可以忽略不计,但在高性能环境中,成本可能会很高。了解这两种情况下的情况可能会有所帮助,以了解您应该期望的差异:
- 在使用临时变量的情况下,获取对象引用,将其存储在临时变量中,将其传递给
,然后让临时变量超出范围someMethod
- 在没有临时变量的情况下,获得ab对象引用,并将其直接传递给
someMethod
for(int i = 0; i < size; i++){
someMethod(strings.get(i));
}
这适用于不需要在循环内使用索引的情况。代码可能会快一点,因为它在内部避免了数组列表中的索引检查。这可能有助于了解这两种情况下的情况,以了解您应该期望的差异:
- 在使用临时变量的情况下,获取对象引用,将其存储在临时变量中,将其传递给
,然后让临时变量超出范围someMethod
- 在没有临时变量的情况下,获得ab对象引用,并将其直接传递给
someMethod
for(int i = 0; i < size; i++){
someMethod(strings.get(i));
}
这适用于不需要在循环内使用索引的情况。代码可能会快一点,因为它在内部避免了数组列表中的索引检查。这可能有助于了解这两种情况下的情况,以了解您应该期望的差异:
- 在使用临时变量的情况下,获取对象引用,将其存储在临时变量中,将其传递给
,然后让临时变量超出范围someMethod
- 在没有临时变量的情况下,获得ab对象引用,并将其直接传递给
someMethod
for(int i = 0; i < size; i++){
someMethod(strings.get(i));
}
这适用于不需要在循环内使用索引的情况。代码可能会快一点,因为它在内部避免了数组列表中的索引检查。这可能有助于了解这两种情况下的情况,以了解您应该期望的差异:
- 在使用临时变量的情况下,获取对象引用,将其存储在临时变量中,将其传递给
,然后让临时变量超出范围someMethod
- 在没有临时变量的情况下,获得ab对象引用,并将其直接传递给
someMethod
for(String s : strings){
someMethod(s);
}
public void foo1(List<String> list) {
for (int i=0; i<list.size(); i++) {
String str = list.get(i);
someMethod(str);
}
}
public void foo2(List<String> list) {
for (int i=0; i<list.size(); i++) {
someMethod(list.get(i));
}
}
public void foo1(java.util.List);
Code:
0: iconst_0
1: istore_2
2: iload_2
3: aload_1
4: invokeinterface #2, 1; //InterfaceMethod java/util/List.size:()I
9: if_icmpge 34
12: aload_1
13: iload_2
14: invokeinterface #3, 2; //InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
19: checkcast #4; //class java/lang/String
22: astore_3
23: aload_0
24: aload_3
25: invokevirtual #5; //Method someMethod:(Ljava/lang/String;)V
28: iinc 2, 1
31: goto 2
34: return
public void foo2(java.util.List);
Code:
0: iconst_0
1: istore_2
2: iload_2
3: aload_1
4: invokeinterface #2, 1; //InterfaceMethod java/util/List.size:()I
9: if_icmpge 32
12: aload_0
13: aload_1
14: iload_2
15: invokeinterface #3, 2; //InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
20: checkcast #4; //class java/lang/String
23: invokevirtual #5; //Method someMethod:(Ljava/lang/String;)V
26: iinc 2, 1
29: goto 2
32: return