本问题已经有最佳答案,请猛点这里访问。

我在java中使用过String,StringBuilder和StringBuffer。

我想到了这个问题,而我从效率的角度思考。

字符串连接中的"+"是否会影响效率?

我认为这在SO上已经讨论了很多?

是的,我认为规则是你应该使用stringbuilder,如果你连接两个以上的字符串...如果你提前有想法/答案,(1)把它作为额外的信息或( b)不要问你已经知道答案的问题。

是的,但是在大多数情况下它都不重要。

对字符串常量使用'+'是最有效的,因为编译器可以执行连接。

如果要连接两个字符串,concat方法是最有效的,因为它避免使用StringBuilder。

除了向后兼容性之外,几乎没有充分的理由使用StringBuffer。 StringBuilder或StringWriter是更好的选择。但是,它仍然比JDK中的StringBuilder更频繁地使用:P

StringBuffer是死的,长期的StringBuffer

在小型连接的情况下"如此之少"。但是,我有过处理具有许多连接(解析器/过滤器)的类的经验,其中简单地从连接更改为缓冲器追加减半(极慢)执行时间。 Microbenchmarks也不太可能向您显示添加所有这些额外的中间字符串对象的垃圾收集成本,但它们将在您的应用程序的整个生命周期内分摊。

在我的应用程序中,我使用线程本地ByteBuffer并使用不创建任何对象的方法直接读取/写入。 99%的用例非常极端,但它可以将您的日志记录缩短到几微秒。 ;)

如果你在一个语句中连接,那么它将无关紧要,因为编译器/ JIT编译器将使用StringBuilder自动优化它。

因此"a"+b+"c"将优化为(new StringBuilder("a").append(b).append("c")).toString()

但是,如果你在一个循环中连接大量的String,那么明确地使用StringBuilder,因为它会显着加快你的程序。

String a ="";

for( int i = 0; i < 1000000; i++ )

a += i;

应改为

StringBuilder sb = new StringBuilder();

for( int i = 0; i < 1000000; i++ )

sb.append(i);

String a = sb.toString();

在你的例子中:

" Does +" +" use in String concatenation affect efficiency?"

我们必须使用文字字符串,它可能会被编译器取代,所以这比StringBuffer / append / toString更快。

但效率/速度比什么呢?代码执行?代码写作?代码阅读?

自从读了一个

"Foo =" + foo;

很容易,我会推荐它,只要它不重复一百万次,或者是"s + = s2;"重复一次hundret时代。

特别,

System.out.println ("Player" + n +" scores" + player[n].score);

比可读性好得多

System.out.println (new StringBuffer ("Player").append ((Integer.valueOf (n)).toString ().append (" scores").append (...

只需在需要高性能的应用程序中避免它,或者连接大量字符串,或者递归地连接大量字符串。

有点是,但仍然没有

来自JLS,15.18.1.2

字符串连接的优化

An implementation may choose to perform conversion and concatenation

in one step to avoid creating and then discarding an intermediate

String object. To increase the performance of repeated string

concatenation, a Java compiler may use the StringBuffer class or a

similar technique to reduce the number of intermediate String objects

that are created by evaluation of an expression.

对于基本类型,实现还可以通过直接从基本类型转换为字符串来优化包装对象的创建。

如果你使用'+'连接多次,那么在某种程度上是肯定的。堂妹

当你执行String a + String b时,它实际上在内部创建一个StringBuffer对象并使用StringBuffer的append()。因此,每次执行'+'时,都会创建一个新的临时StringBuffer对象,使用"a"初始化,然后附加"b",然后将其转换为字符串对象。

因此,如果您需要多个连接,您应该创建一个StringBuffer(线程安全)/ StringBuilder(而不是线程安全)对象并继续追加,这样就可以避免一次又一次地创建StringBuffer对象。

"multiple"只对你在多个语句中展开字符串是正确的。带+的单个语句与单个字符串构建器一样有效,但读取要好得多(编译器可以更好地优化初始大小)。

我很确定第二段解决了这个问题。

由于字符串是不可变的,因此连接字符串会导致字符串创建。 ie .."A"+"B"+"C"导致"AB"的创建,然后是"ABC"。如果你正在进行多个连接,那么使用StringBuilder总是更有效率(不是旧的但是api相同的StringBuffer,它具有同步成本)

如果你有一个单行连接,编译器会尽可能为你做这个 - 也就是说,如果你编译"A"+"B"+"C",你可能会看到,如果你反编译,像新的StringBuilder("A")。附加("B")。附加("C")。的toString()。但是,编译器无法在多行上优化多个字符串连接 - 即,如果您有多个连接行,您将在每行上看到类似上面的内容,包括额外的StringBuilder创建。最好手动完成。

您可以通过组合一个简单的示例和反编译来自行验证。

这是错误的,如果你写"A"+"B"+"C"你就不会得到中间字符串。

java字符串连接效率_关于java:字符串连接中的“+”是否会影响效率?相关推荐

  1. java怎么查询千万数据,从java方面,在一个千万级的数据库查寻中,如何提高查询效率?...

    从java方面,在一个千万级的数据库查寻中,如何提高查询效率? 更多相关问题 请分析下面的歌曲<沂蒙山我的娘亲亲>片段中采用了那种长音或休止处的处理方法faea48d2d30c3b221e ...

  2. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  3. 小度计算机模式,小度怎么连接电脑_小度智能音箱连接电脑的详细操作步骤

    如果讲智能音箱哪家卖得好,小度肯定是排在前一二的,而大家不知道的是小度不仅可以连接手机,还可以连接电脑,那么小度智能音箱怎么与电脑配对和连接呢,为了给大家一些参考,下面智能手机网小编就带来了教小度智能 ...

  4. java字符串底层实现_「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过...

    Java基础之字符串操作--String 字符串 什么是字符串?如果直接按照字面意思来理解就是多个字符连接起来组合成的字符序列.为了更好的理解以上的理论,我们先来解释下字符序列,字符序列:把多个字符按 ...

  5. java 字符串输出字符_输出java字符串

    1-1 字符串排序 用Java编写一个能对一组字符串按字典序升序排序的程序 输入为N和N行字符串,需要按行输出字符串升序排序的结果 如输入 3 Abc Abe Abd 输出: Abc Abd Abe ...

  6. java获取字符串最长_基于java查找最长字符串代码实例

    题目:编写程序,针对输入的N个字符串,输出其中最长的字符串 输入样例: 4 zhaoming zhangming sunming liming 输出样例: 最长的字符串:zhangming 代码如下 ...

  7. java string最大长度_一个Java字符串中到底有多少个字符?

    作者:鸟窝 依照Java的文档, Java中的字符内部是以UTF-16编码方式表示的,最小值是 (0),最大值是(65535), 也就是一个字符以2个字节来表示,难道Java最多只能表示 65535个 ...

  8. java jcombobox 获取值_从java中的JComboBox获取字符串值

    我正在做一个testJComboBox程序.一旦我选择了jCombobox的输出,我就会得到我需要的字符串值.但是,它不起作用. 这是我的代码: import java.awt.*; import j ...

  9. java 查找大写字母_在Java中查找字符串的所有大写字母

    因此,我试图在用户输入的字符串中查找所有大写字母,但始终出现此运行时错误: Exception in thread "main" java.lang.StringIndexOutO ...

最新文章

  1. 教你在Python中实现潜在语义分析(附代码)
  2. 工业富联:左手工业AI,右手“雾小脑”
  3. www服务器把信息组织成,管理信息系统第4章习题.doc
  4. 使用Hadoop计算共现矩阵
  5. 对未来人机融合智能领域的思考
  6. warning: C4819的解决办法
  7. 闪迪内存卡软件测试,存储卡不稳定?我们用微波炉测试 结果震惊了!
  8. python nlpir_Python 中文分词 NLPIR 快速搭建
  9. html中的reset(重置)按钮
  10. 使用D触发器完成带有异步清零clrn和同步使能wen的8位寄存器
  11. 关于苹果手机部分版本机型上传时卡住相册问题记录
  12. 2021年美赛B题目简述(中英文)
  13. 数据库笔试——查出各部门超出部门平均薪资的员工的姓名,薪资,所在部门名称及部门平均薪水...
  14. 酷我音乐 linux,GitHub - weakish/kwplayer: 酷我音乐盒的 Gtk/Linux 实现
  15. spark写 本地文件报错
  16. 软件加密系统Themida应用程序保护指南(七):外挂插件
  17. 产品开发中的经验教训
  18. 详解BigDecimal及其加减乘除运算
  19. 如何把Windows 7英文系统转换为中文系统
  20. Android Studio实现一个点餐系统

热门文章

  1. 【Spring】HttpMessageNotWritableException No converter found for return value of type
  2. 【JVM】G1垃圾回收器
  3. 命令:服务器与CST时间误差8小时的修复方法——timedatectl
  4. Springboot启动扩展点超详细总结,再也不怕面试官问了
  5. Gitlab+Docker实现持续集成(CI)与持续部署(CD)
  6. Java基础-IO流
  7. 使用命令编译运行Java程序
  8. OUTLOOK2019 解决 无法验证您连接到的服务器使用的安全证书
  9. POJ 1821 Fence(单调队列优化DP)
  10. Topcoder Asia Programming Competition