假设我有一个包含 100 个字符串的列表。以下两种方法在性能上是否存在差异(或任何其他差异)
1.
List<String> myList = Arrays.asList("s1", "s2", "s3"....."s100");
foo(myList);
private void foo(List<String> myList) {
// logic to choose 2 strings from the list
//do something with -- str1 and str2
}
2.
List<String> myList = Arrays.asList("s1", "s2", "s3"....."s100");
// logic to choose 2 strings from the list
foo(str1, str2);
private void foo(String myStr1, String myStr2) {
//do something with -- myStr1 and myStr2
}
由于 Java 传递列表或单个字符串的引用(作为值),我假设这些参数将只保存(副本)引用/地址。所以我倾向于通过整个列表。
上面将是一个实用方法,我想将“从列表中选择 2 个字符串的逻辑”放在 foo 方法中,这样调用者就不必在调用之前重复该逻辑;但我担心发送一个大列表作为参数。
感谢您的帮助。
** 编辑:** 是的,我正在寻找性能问题。
和List<String>
可能不是正确的例子。将其视为 Map<String,Long>
(城市,温度)。逻辑将是始终选择芝加哥和洛杉矶以及 foo
将在温度下运行。请注意,此逻辑将始终相同,调用者只需重复方法 #2 中的相同代码。
最佳答案
我建议您忽略性能上的潜在差异(在这种情况下可以忽略不计)并完全关注代码的清晰度。换句话说,问题不在于哪个更有效,而是哪个能更好地反射(reflect)您调用的方法的意图。如果 foo
是一种自然需要两个参数的方法(例如 storeFullName
),那么它应该传递两个参数。如果它自然希望从列表中选择两个值(例如 printTwoLongestStrings
),那么它应该采用一个集合。
你也可以考虑给每个方法一个 single responsibility 的原则.在这种情况下,使用单独的方法来选择两个值并用它们做一些事情可能是有意义的:
Pair<String, String> longestPair = getTwoLongestStrings(list);
printStrings(longestPair);
** 编辑 **
您的问题已阐明您特别关注性能,并且您提供了有关用例的更多详细信息。具体来说,您是在询问将一个列表或两个值传递给方法时性能是否存在差异。是,有一点不同。我运行了一个试验,使用两个字符串参数和一个列表调用一个空函数 100 亿次。列表调用用了 24 秒,单独的参数调用用了 13 秒。其他物理硬件可能会显示不同的结果。也有可能 JVM 优化并没有使它成为一个公平的测试。
public class PerfTest {
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "b");
long time1 = System.currentTimeMillis();
for (long i = 0; i < 1E10; i++) {
func1("a", "b");
}
long time2 = System.currentTimeMillis();
for (long i = 0; i < 1E10; i++) {
func2(list);
}
System.out.println((time2 - time1) + "/" + (System.currentTimeMillis() - time2));
}
private static void func1(String s1, String s2) { }
private static void func2(List<String> sl) { }
}
但是我上面的回答仍然有效:如果你调用一个函数 100 亿次,那么它可能值得优化,但更好的做法是从关注清晰度开始,然后使用分析来关注代码调优工作,如果是必需的。
关于java - 在 Java 中将列表或单个列表项作为方法参数传递是否更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40120289/