java - 在 Java 中将列表或单个列表项作为方法参数传递是否更有效?

标签 java list methods parameter-passing pass-by-value

假设我有一个包含 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/

相关文章:

java - HashMap 中的重复值

python - 如何在条件下计算 csv 文件中某个单词的出现次数?

java - 如何使用通过 Class.forName(String) 获得的类的方法?

c++ - C++ 类中的 Getline

java - 使用 ffmpeg 从 Red5 转换音频

java - 何时在 JDK 8+ 中使用 Optional<T> 与 OptionalT(其中 T 是盒装原始类型)?

java - PDFBox 2.0.8 签署文档时出现问题

perl - 访问列表作为哈希

python - 如何知道坐标列表是否形成矩形?

jquery - 使用 jQuery 从元素中获取特定文本内容