当前位置: 首页 > 知识库问答 >
问题:

最佳实践/性能:混合StringBuilder。用字符串追加。海螺

农波涛
2023-03-14

我试图理解什么是最佳实践,以及为什么在不同情况下连接字符串文本和变量。例如,如果我有这样的代码

StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
    .append(B_String).append("CCCCCCCCCCC").append(D_String)
    .append("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
    .append("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");

这样做吗?在这篇文章中,我注意到字符串上的操作符创建了一个新的StringBuilder实例,连接操作数,并返回字符串转换,这似乎比调用要复杂得多。append();如果这是真的,那就不可能了。但是字符串呢。concat()?使用是否合适。append()用于每个连接?或者只针对变量,可以使用附加文字。concat()

StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
    .append(B_String.concat("CCCCCCCCCCC")).append(D_String
    .concat("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
    .concat("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"));

在这些情况下,最佳实践和绩效的一般规则是什么?我对的假设正确吗?它真的不应该被使用吗?

共有3个答案

席波娃
2023-03-14

优化由编译器自动完成。

Java2编译器将自动转换以下内容:

String s = s1 + s2; 

String s = (new StringBuffer()).append(s1).append(s2).toString();

直接摘自Java最佳实践网站上的甲骨文。

吕霄
2023-03-14

编译器优化了连接。

所以

int a = 1;
String s = "Hello " + a;

变成

new StringBuilder(). append("Hello"). append(1). toString();

这里有一个很好的主题解释了为什么应该使用运算符。

仰城
2023-03-14
String s = s1 + s2

在幕后,这被翻译成:

String s = new StringBuilder(s1).append(s2).toString();

想象一下,如果这里有s1 s2,它会增加多少额外的工作:

stringBuilder.append(s1 + s2)

而不是:

stringBuilder.append(s1).append(s2)

值得注意的是:

String s = s1 + s2 + s3 + ... +sN

翻译为:

String s = new StringBuilder(s1).append(s2).append(s3)...apend(sN).toString();
String s = s1.concat(s2);

String创建可以同时适合s1s2char[]数组。将s1s2内容复制到这个新数组。实际上需要比操作员更少的工作。

维护一个内部char[]数组,该数组在需要时增长。如果内部字符足够大,则不会创建额外的char[]

stringBuilder.append(s1.concat(s2))

性能也很差,因为s1.concat(s2)创建了一个额外的char[]数组,并将s1s2复制到它,只是为了将新数组内容复制到内部StringBuilderchar[].

也就是说,您应该一直使用append(),并附加原始字符串(您的第一个代码片段是正确的)。

 类似资料:
  • 问题内容: 我试图了解什么是最佳实践,以及为什么要在不同情况下串联字符串文字和变量。例如,如果我有这样的代码 这是这样做的方式吗?从这篇文章中,我注意到Strings上的运算符创建了一个StringBuilder的新实例,连接了操作数,并返回了String转换,这似乎比仅仅调用还要多;所以如果这是真的,那是不可能的。但是那又如何呢?是否适合用于每个串联?或仅用于变量,文字可以追加吗? 应对这些情况

  • Overview This article discusses performance and reliability best practices for Express applications deployed to production. This topic clearly falls into the “devops” world, spanning both traditional

  • 我有一个Java的应用程序,我正在使用JSoup库进行一些网络抓取。我正在使用该库,它返回了其中6个字符串的集合。我需要将这6个随机字符串映射到对象的属性。我知道字符串的顺序,以及哪个数字映射到哪个属性。我觉得我的方法不是处理这个问题的最佳方法。感觉很失败,易读性很差,我只是想知道是否有更好的方法来做到这一点。我在考虑单独使用枚举或其他东西。长话短说,这是一个代码片段。感谢您的任何帮助。

  • 性能与体验是前端的核心竞争力,是最直观反应页面是否好用、易用的标准。用户花在页面上的时间不应该是在等待页面加载和响应,而是使用和顺畅浏览的时间,因此如何提升页面性能和体验,让页面更快的可交互、浏览滚动更顺畅,是需要你持续的研究、优化、推进的。在 Rax 不断应用发展以及成熟的过程中,沉淀总结了一系列的性能体验的措施和最佳实践,通过这些,可以帮助你大幅提高页面的各项性能。 加载性能 统计口径 加载性

  • 问题内容: 我正在使用Hibernate 3编写Web应用程序。 所以,过了一会儿,我注意到有些东西很慢。因此,我测试了Hibernate Profiler,发现Hibernate将无理地进行许多数据库调用以简化操作。原因当然是我加载了一个对象(该对象有几个“父母”),而这些“父母”还有其他“父母”。因此,即使我只需要基本对象,从根本上来说,hibernate都会加载它们。好的,所以我研究了延迟加

  • 1.1 前言 本文档主要通过实例指导如何在HPB主网上发布智能合约教程。 文档阅读人员:社区开发人员、测试人员、运维人员。 1.2 学习准备 1.2.1 Solidity语言 Solidity是一种开源的智能合约高级语言,可以运行支持开源的Ethereum虚拟机(EVM)之上。 具体的语言介绍和学习入门,在以下的网址中有详细介绍: https://solidity.readthedocs.io/e