Java 动作100亿次之后,它可能值得优化,但更好的做法是从关注清晰性开始,然后在需要时使用评测来关注代码调优工作。

Java 动作100亿次之后,它可能值得优化,但更好的做法是从关注清晰性开始,然后在需要时使用评测来关注代码调优工作。,java,list,methods,parameter-passing,pass-by-value,Java,List,Methods,Parameter Passing,Pass By Value,如果方法对列表本身而不仅仅是其项感兴趣,我建议只使用列表作为参数,例如,it计划对其进行修改 对于其他情况,如果有固定数量的参数,则每个参数都应该是它自己的参数。但是你的案例表明你的论点数量是可变的。为此,您还可以使用varargs: private void foo(String... strings) { // `strings` is an array now } 这样做的好处是,调用方可以选择使用单个对象或数组调用函数: foo("Hello", "World"); 还是这个

如果方法对列表本身而不仅仅是其项感兴趣,我建议只使用
列表作为参数,例如,it计划对其进行修改

对于其他情况,如果有固定数量的参数,则每个参数都应该是它自己的参数。但是你的案例表明你的论点数量是可变的。为此,您还可以使用varargs:

private void foo(String... strings) {
    // `strings` is an array now
}
这样做的好处是,调用方可以选择使用单个对象或数组调用函数:

foo("Hello", "World");
还是这个

String[] strings = new String[]{"Hello", "World"};
foo(strings);
甚至这个:

List<String> strings = ...;
foo(strings.toArray(new String[0]));
列出字符串=。。。;
foo(strings.toArray(新字符串[0]);

如果您担心将列表转换为数组,请坚持传递列表本身。

如果方法对列表本身感兴趣,而不仅仅是它的项感兴趣,我建议仅使用
列表作为参数,例如,它计划修改列表

对于其他情况,如果有固定数量的参数,则每个参数都应该是它自己的参数。但是你的案例表明你的论点数量是可变的。为此,您还可以使用varargs:

private void foo(String... strings) {
    // `strings` is an array now
}
这样做的好处是,调用方可以选择使用单个对象或数组调用函数:

foo("Hello", "World");
还是这个

String[] strings = new String[]{"Hello", "World"};
foo(strings);
甚至这个:

List<String> strings = ...;
foo(strings.toArray(new String[0]));
列出字符串=。。。;
foo(strings.toArray(新字符串[0]);


如果您担心将列表转换为数组,请继续传递列表本身。

我想您是在询问列表参数是否通过引用传递。它是。在已编译的机器代码中,对于list参数,只会向函数传递一个指向list对象实例的指针。没有理由担心有一个大的列表作为参数。

我想你是在问列表参数是否通过引用传递。它是。在已编译的机器代码中,对于list参数,只会向函数传递一个指向list对象实例的指针。没有理由担心有一个大的列表作为参数。

选择两个字符串或者仅仅对它们进行操作真的应该是
foo
的责任吗?我认为如果不了解该方法的更多用例,就无法回答这个问题。除非你的问题是关于性能的,在这种情况下,答案是选择一点都不重要。@ChiefTwoPencils
foo
将特别需要这两个字符串值。但是执行选择这些字符串的逻辑不一定是foo的责任。但请注意,逻辑将是相同的,如果要求呼叫者这样做,呼叫者将重复这些逻辑。因此我想把它放在
foo
@VGR中是的,我的问题主要是关于性能。因此,发送一个庞大的列表作为参数并不重要?这是因为只有列表的引用将作为值传递,而不是整个列表?如果您的问题是关于性能的,那么应该在主题行中。”“更好”是一个模棱两可的词。你在问题中也有“和任何其他区别”。选择两个字符串还是仅仅对它们进行操作真的是
foo的责任吗?我认为如果不了解更多关于该方法的用例,就无法回答这个问题。除非你的问题是关于性能的,在这种情况下,答案是选择一点都不重要。@ChiefTwoPencils
foo
将特别需要这两个字符串值。但是执行选择这些字符串的逻辑不一定是foo的责任。但请注意,逻辑将是相同的,如果要求呼叫者这样做,呼叫者将重复这些逻辑。因此我想把它放在
foo
@VGR中是的,我的问题主要是关于性能。因此,发送一个庞大的列表作为参数并不重要?这是因为只有列表的引用将作为值传递,而不是整个列表?如果您的问题是关于性能的,那么应该在主题行中。”“更好”是一个模棱两可的词。问题中还有“和任何其他差异”。+1表示代码清晰。在绝大多数情况下,清晰是最重要的,除非您认为这是代码中的瓶颈,否则您可以在不牺牲可读性的情况下优化其他内容。谢谢@sprinter。我想知道为什么有利于个人论点的差异?因为Java将把列表的“reference by value”而不是整个列表传递给方法;所以它看起来像是传递1个引用,而不是传递2个引用。而通过1个引用应该花费更少的时间?性能差异(如果存在的话)非常小,根本不需要关心。差异将存储方法内部和外部的两个值;传递它们甚至不值得关心。@LouisWasserman我同意这种差异应该被忽略。然而,我仍然对我写的测试中时间差的任何解释感兴趣。我不认为你的评论解释了为什么列表引用慢得多。@Gadam是的,我也很感兴趣,但不是JVM内部工作的专家,所以不能真正回答这个问题。正如在上面的评论中指出的,我使用的方法是非常狡猾的(即,只是比较系统时钟),所以这可能不是一个公平的测试。我将发布一个单独的问题,看看是否有人知道足够的答案。为了代码的清晰性+1。在绝大多数情况下,清晰是最重要的,除非您认为这是代码中的瓶颈,否则您可以在不牺牲可读性的情况下优化其他内容。谢谢@sprinter。我想知道为什么有利于个人论点的差异?因为Java将把列表的“reference by value”而不是整个列表传递给方法;所以看起来像