加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java代码优化,它会优化这一点

发布时间:2020-12-15 05:20:43 所属栏目:Java 来源:网络整理
导读:对于较新的编译器,我发现自己试图编写更容易阅读的代码,但如果我希望在引擎盖下完成的优化实际上没有完成,那么可能需要更多的内存. 以此代码为例,非常简单 while (scanner.hasNextLine() !result){ String line = scanner.nextLine(); result = line.indexOf
对于较新的编译器,我发现自己试图编写更容易阅读的代码,但如果我希望在引擎盖下完成的优化实际上没有完成,那么可能需要更多的内存.
以此代码为例,非常简单

while (scanner.hasNextLine() && !result)
{
    String line = scanner.nextLine();
    result = line.indexOf(searchString) >= 0;
}

假设(使用Eclipse Juno,Java 7)这将产生与之相同的字节代码是否公平

while (scanner.hasNextLine() && !result)
{
    result = scanner.nextLine().indexOf(searchString) >= 0;
}

前者虽然2行代码减少了第二行的长度并使其更容易在眼睛上.恕我直言
但它是否也会导致创建一个无关的String对象?我希望不是 …

解决方法

您无法转义正在创建的String.将它分配给局部变量这一事实在这里是无关紧要的,实际上在字节码级别,这个事实甚至不会被注意到:在该级别,无论是否有显式变量,对结果的引用必须放在堆栈中为了传递到链中的下一个方法调用.

您创建不必要的String实例的想法可能源于来自另一种语言的本能,例如C:赋值String s = …仅复制对唯一的字符串实例的引用.这是因为所有Java对象都驻留在堆上,因此您始终需要显式复制对象以实际涉及另一个实例.例如,如果您编写了String line = new String(scanner.nextLine()),那确实会创建一个不必要的String实例.

总而言之,任何版本的代码都不涉及优化,因此请仅根据样式首选项进行选择.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读