Java 哪个代码';s的表现更好吗?

Java 哪个代码';s的表现更好吗?,java,performance,Java,Performance,我有两个相同的条件,我想知道哪一个表现良好 if(str_final.charAt(str_final.length() -1) == 'a' || str_final.charAt(str_final.length() -1) == 'b' ) { // body } --------------------或-------------------- char temp = str_final.charAt(str_final.length() -1); if( temp

我有两个相同的条件,我想知道哪一个表现良好

if(str_final.charAt(str_final.length() -1) == 'a'
    || str_final.charAt(str_final.length() -1) == 'b' )
{
    // body 
}
--------------------或--------------------

char temp = str_final.charAt(str_final.length() -1);
if( temp == 'a' || temp == 'b')
{
    // body
}
第二个版本稍微快一点

原因:
2个方法调用较少(如果不以“a”结尾)。
但两者都不超过
返回变量

  • charAt()
    只是对数组的访问,并且
  • 字符串的
    length()
第二个版本稍微快一点

原因:
2个方法调用较少(如果不以“a”结尾)。
但两者都不超过
返回变量

  • charAt()
    只是对数组的访问,并且
  • 字符串的
    length()

第二个代码是更好的选择,因为str_final.charAt(str_final.length()-1)在最坏的情况下也只执行一次

char temp = str_final.charAt(str_final.length() -1);

if( temp == 'a' || temp == 'b')
{
  // body
}

在另一种情况下,str_final.charAt(str_final.length()-1)必须执行两次。

第二个代码是更好的选择,因为str_final.charAt(str_final.length()-1)在最坏的情况下也只执行一次

char temp = str_final.charAt(str_final.length() -1);

if( temp == 'a' || temp == 'b')
{
  // body
}

在另一种情况下,str_final.charAt(str_final.length()-1)必须执行两次。

第二段代码更快,因为
.charAt
.length()
只计算一次。正如其他人指出的那样,可读性显然更为重要,这也有利于第二种解决方案。

第二段代码更快,因为
.charAt
.length()
只计算一次。正如其他人指出的,可读性显然更为重要,这也有利于第二种解决方案。

这是一个棘手的问题吗?我当然更喜欢第二种结构,因为它更具可读性,而且可能性能更好


编译器可以轻松地优化临时变量,但无法确定函数调用是否有副作用。因此,双函数调用不能优化为一个调用。

这是一个关键问题吗?我当然更喜欢第二种结构,因为它更具可读性,而且可能性能更好


编译器可以轻松地优化临时变量,但无法确定函数调用是否有副作用。因此,不能将双函数调用优化为一个调用。

这可能是相同的性能,因为优化编译器(或即时编译器/热点)可以在编译时将第1个版本更改为第2个版本。

它可能与优化编译器(或即时编译器/热点)的性能相同可以在编译时将第一个版本更改为第二个版本。

第二个版本不能再慢了,所以我想我会说第二个版本,因为它至少避免了方法调用。但是,JIT将把它内联起来。除非这是一个非常紧密的循环,否则性能差异几乎可以忽略不计


我个人认为第二个变量更具可读性(如果您调用变量而不是“temp”)。因此,基于这些理由,我会投赞成票。但我认为这是一个更好的问题:哪个更清楚?当您有理由相信这是代码问题时,请担心性能。

第二个问题不能再慢了,所以我想我会说第二个问题,因为它至少避免了方法调用。但是,JIT将把它内联起来。除非这是一个非常紧密的循环,否则性能差异几乎可以忽略不计


我个人认为第二个变量更具可读性(如果您调用变量而不是“temp”)。因此,基于这些理由,我会投赞成票。但我认为这是一个更好的问题:哪个更清楚?当您有任何理由相信这是代码问题时,请担心性能。

我会选择第二个选项,因为它更易于阅读。另外,
str\u final.length()
str\u final.charAt()
只调用一次

此外,与其调用char
temp
,不如将其称为更有意义的对象,如
lastChar

你甚至可以考虑使用一个开关语句,如果你有两个以上的字符来检查:

char lastChar = str_final.charAt(str_final.length() -1);
switch (lastChar) {
  case 'a':
  case 'b':
    //do something
    break;
  case 'c':
    //something else
    break;
  case 'd':
    //something else
    break;
}

我会选择第二个选项,因为它更容易阅读。另外,
str\u final.length()
str\u final.charAt()
只调用一次

此外,与其调用char
temp
,不如将其称为更有意义的对象,如
lastChar

你甚至可以考虑使用一个开关语句,如果你有两个以上的字符来检查:

char lastChar = str_final.charAt(str_final.length() -1);
switch (lastChar) {
  case 'a':
  case 'b':
    //do something
    break;
  case 'c':
    //something else
    break;
  case 'd':
    //something else
    break;
}

第二个选项速度更快,可读性也更高,但是使用比“temp”更好的名称第二个选项速度更快,可读性也更高,但是使用比“temp”更好的名称第二个版本更好,尽管它的性能比第一个版本小,但它也有两个优点 1.可读性
2.维护——对于这种类型的代码,假设您必须检查更多的条件(比如10),然后更改逻辑,只需一个位置

第二个版本更好,尽管它的性能比第一个版本稍差,但它也有两个优点 1.可读性
2.维护——对于这种类型的代码,假设您必须检查更多的条件(比如10),然后更改逻辑,只需一个位置

真正的问题是哪一个更具可读性?:)谈论可读性。。。那么
.endsWith(“a”)
?关心如此微小细节的性能就像用指甲剪修剪草坪。是的,感谢所有。。。我只是在考虑内存,因为我创建了一个临时变量,在一个if中有很多这样或那样的条件。。。现在我认为第二个更好,它值得创建一个变量。。。再次感谢大家……如果您创建一个对象,它的成本将比这样的操作高出10倍以上。我会的