Java 调用方法与分配返回类型

Java 调用方法与分配返回类型,java,Java,我想知道哪一个好。我正在写一个for循环。在条件部分,我使用str.length。我想知道这是个好主意吗。我还可以将该值赋给一个整数变量,并在循环中使用它 哪种方法更合适/更好?如果在代码中多次使用str.length,出于简洁的考虑,将其提取到局部变量是合乎逻辑的。至于性能,它很可能是完全相同的,因为JIT编译器将内联该调用,因此本机代码就像您使用了局部变量一样。如果您在代码中多次使用str.length,出于简洁起见,将其提取到局部变量是合乎逻辑的。至于性能,它很可能是完全相同的,因为JIT

我想知道哪一个好。我正在写一个for循环。在条件部分,我使用str.length。我想知道这是个好主意吗。我还可以将该值赋给一个整数变量,并在循环中使用它


哪种方法更合适/更好?

如果在代码中多次使用str.length,出于简洁的考虑,将其提取到局部变量是合乎逻辑的。至于性能,它很可能是完全相同的,因为JIT编译器将内联该调用,因此本机代码就像您使用了局部变量一样。

如果您在代码中多次使用str.length,出于简洁起见,将其提取到局部变量是合乎逻辑的。至于性能,它很可能是完全相同的,因为JIT编译器将内联该调用,因此本机代码就像使用了局部变量一样。

两者之间没有任何区别 但是假设str.length发生变化,那么在for循环中,您需要手动更改该值

比如说 字符串str=hi; 所以在for循环中,你是这样写的

for int i=0;i<str.length();i++)
{
}

现在假设您想要更改str字符串str=hi1

所以在for循环中

for int i=0;i<3;i++)
    {
    }

所以我建议你选择str.length,两者之间没有任何区别 但是假设str.length发生变化,那么在for循环中,您需要手动更改该值

比如说 字符串str=hi; 所以在for循环中,你是这样写的

for int i=0;i<str.length();i++)
{
}

现在假设您想要更改str字符串str=hi1

所以在for循环中

for int i=0;i<3;i++)
    {
    }
因此,我建议您选择str.length,如果您始终使用str.length,则将对此进行评估。最好将该值指定给变量,并在for循环中使用该值

  for(int i=0; i<str.length;i++){ // str.length always evaluvated

  }

  int k=str.length; // only one time evaluvated

  for(int i=0;i<k;i++){

  }
如果您担心性能,可以使用第二种方法

如果始终使用str.length,则将对此进行计算。最好将该值指定给变量,并在for循环中使用该值

  for(int i=0; i<str.length;i++){ // str.length always evaluvated

  }

  int k=str.length; // only one time evaluvated

  for(int i=0;i<k;i++){

  }
如果您担心性能,可以使用第二种方法

在循环条件表达式中调用函数没有明显的缺点,因为您确实不应该这样做。在调用具有副作用的函数时,您需要小心,但在某些情况下,即使这样也可以接受

将函数调用移出循环(包括循环条件表达式)有三个主要原因:

表演。根据编译器的不同,该函数可能会在循环的每次迭代中被调用,这会占用您的执行时间。特别是如果函数的代码在第一次执行后的复杂度高于O1,这将增加执行时间。这在多大程度上取决于所讨论的函数的确切功能以及如何实现

。如果该功能有任何副作用,则可能会重复执行这些副作用。这可能正是你想要的,但你需要意识到这一点。副作用基本上是在被调用的函数之外可以观察到的东西;例如,磁盘或网络I/O通常被认为是副作用。简单地对现有数据执行计算的函数通常是一个函数

代码清晰。诚然str.length不是很长,但是如果您有一个基于循环条件中的函数调用的复杂计算,那么代码的清晰度很容易受到影响。因此,将循环终止条件计算移出循环条件表达式本身可能是有利的。然而,当心唤醒沉睡的野兽;确保重构后的代码实际上更具可读性

对于str.length来说,这并不重要,除非你真的在追求你能得到的最后一点性能,特别是by,是一个O1复杂度的操作。特别是在一般情况下,如果需要额外的性能,考虑引入一个变量来保存函数调用的结果,并与其进行比较,而不是重复调用函数。 个人而言,我会考虑代码清晰性,然后关注微优化,比如确切地放置特定函数调用的位置。但是,如果您已经完成了所有其他工作,并且仍然需要从代码中获得更高的性能,那么将函数调用移出条件表达式并使用局部变量(最好是原始类型的局部变量)是值得考虑的。然而,如果你担心这一点,你很有可能会看到通过考虑不同的算法获得更大的收益。您真的需要按现在的方式迭代字符串吗?没有其他方法可以完成您所追求的任务吗?

在循环条件表达式中调用函数没有明显的缺点,因为您确实不应该这样做。在调用具有副作用的函数时,您需要小心,但在某些情况下,即使这样也可以接受

Ther e是将函数调用移出循环的三个主要原因,包括循环条件表达式:

表演。根据编译器的不同,该函数可能会在循环的每次迭代中被调用,这会占用您的执行时间。特别是如果函数的代码在第一次执行后的复杂度高于O1,这将增加执行时间。这在多大程度上取决于所讨论的函数的确切功能以及如何实现

。如果该功能有任何副作用,则可能会重复执行这些副作用。这可能正是你想要的,但你需要意识到这一点。副作用基本上是在被调用的函数之外可以观察到的东西;例如,磁盘或网络I/O通常被认为是副作用。简单地对现有数据执行计算的函数通常是一个函数

代码清晰。诚然str.length不是很长,但是如果您有一个基于循环条件中的函数调用的复杂计算,那么代码的清晰度很容易受到影响。因此,将循环终止条件计算移出循环条件表达式本身可能是有利的。然而,当心唤醒沉睡的野兽;确保重构后的代码实际上更具可读性

对于str.length来说,这并不重要,除非你真的在追求你能得到的最后一点性能,特别是by,是一个O1复杂度的操作。特别是在一般情况下,如果需要额外的性能,考虑引入一个变量来保存函数调用的结果,并与其进行比较,而不是重复调用函数。
个人而言,我会考虑代码清晰性,然后关注微优化,比如确切地放置特定函数调用的位置。但是,如果您已经完成了所有其他工作,并且仍然需要从代码中获得更高的性能,那么将函数调用移出条件表达式并使用局部变量(最好是原始类型的局部变量)是值得考虑的。然而,如果你担心这一点,你很有可能会看到通过考虑不同的算法获得更大的收益。您真的需要按现在的方式迭代字符串吗?没有其他方法来做你想做的事吗?

通常都没关系。使用使代码更清晰的选项

如果一个值将被多次使用,那么将其指定给局部变量有两个优点:

您可以给变量起一个好名字,这使您的代码更容易阅读和理解 通过只调用一次方法,有时可以避免少量开销。这有助于提高性能,尽管差异通常太小而不明显——如果有疑问,您应该进行基准测试
注意:此建议仅适用于纯函数。如果函数有副作用,或者每次都可能返回不同的值(如Math.random),则需要更加小心。在这些情况下,您需要更加仔细地考虑多个函数调用的影响。

这通常无关紧要。使用使代码更清晰的选项

如果一个值将被多次使用,那么将其指定给局部变量有两个优点:

您可以给变量起一个好名字,这使您的代码更容易阅读和理解 通过只调用一次方法,有时可以避免少量开销。这有助于提高性能,尽管差异通常太小而不明显——如果有疑问,您应该进行基准测试 注意:此建议仅适用于纯函数。如果函数有副作用,或者每次都可能返回不同的值,如Math.random,则需要更加小心。在这种情况下,您需要更加仔细地考虑多个函数调用的影响。

调用长度成本O1,因为长度存储为成员-这是一个常量操作,不要浪费时间考虑这件事的复杂性和性能。

调用长度会花费O1,因为长度存储为一个成员-这是一个常量操作,不要浪费时间考虑这件事的复杂性和性能。

如果您在代码中多次使用str.length,则需要将其分配给另一个变量并使用它。否则,您可以使用str.length本身

需要理由

当我们调用一个方法时,每次将当前位置存储在DS堆/堆栈中,并转到相应的被调用方法并进行操作 然后从DS返回并检索当前位置并执行正常操作。 这实际上正在发生。因此,当我们在一个程序中多次这样做时,会导致上述场景多次出现。 因此,我们需要创建一个局部变量并分配给它,并在程序中需要的地方使用。

如果您在代码中使用str.length 一次,然后您需要将其分配给另一个变量并使用它。否则,您可以使用str.length本身

需要理由

当我们调用一个方法时,每次将当前位置存储在DS堆/堆栈中,并转到相应的被调用方法并进行操作 然后从DS返回并检索当前位置并执行正常操作。 这实际上正在发生。因此,当我们在一个程序中多次这样做时,会导致上述场景多次出现。
因此,我们需要创建一个局部变量并分配给它,并在计划中需要的地方使用。

实际上,我正计划参加面试。我正在网上搜索一些面试问题。我看到很少有人问我如何在字符串中搜索一个子字符串,这需要花费时间甚至更少。所以我只是想知道哪一个是有效的。这与写作无关。循环条件下的长度,因为长度存储为一个字段,获取它需要O1,它不会影响时间复杂性。实际上我正计划参加面试。我正在网上搜索一些面试问题。我看到很少有人问我如何在字符串中搜索一个子字符串,这需要花费时间甚至更少。所以我只想知道哪一个是有效的。这与写入无关。循环条件下的长度,因为长度存储为字段,获取它需要O1,它不会影响时间复杂性。请解释为什么需要这样做。似乎是过早的优化请解释为什么需要这样做。似乎是过早的优化我从你的回答中看到性能取决于我们使用的编译器类型。oracle发布的标准java编译器是否内联方法调用?另一件事是我不明白副作用的部分。你能解释一下吗?感谢you@KrishnaChaitanya我不太熟悉抖动的具体情况,更重要的是,在不同版本之间可能会发生变化。其他答案包括具体长度;我在回答你的问题时,更多的是按照标题中的一般方式,而不是专注于你使用的具体例子。JIT内联实际上是运行时环境的一个实现细节:它在那里很好,但在一般情况下,你不能依赖它在那里。@KrishnaChaitanya我添加了一些关于副作用的解释。希望现在更清楚了。我从你的回答中看到,性能取决于我们使用的编译器的类型。oracle发布的标准java编译器是否内联方法调用?另一件事是我不明白副作用的部分。你能解释一下吗?感谢you@KrishnaChaitanya我不太熟悉抖动的具体情况,更重要的是,在不同版本之间可能会发生变化。其他答案包括具体长度;我在回答你的问题时,更多的是按照标题中的一般方式,而不是专注于你使用的具体例子。JIT内联实际上是运行时环境的一个实现细节:它在那里很好,但在一般情况下,你不能依赖它在那里。@KrishnaChaitanya我添加了一些关于副作用的解释。希望现在更清楚了。