0 0

String 的“+”操作一定比 StringBuilder.append()慢吗5

如果不知道而想知道就去看java特种兵这本书,讲的很透彻
2014年9月24日 11:45

7个答案 按时间排序 按投票排序

1 0

采纳的答案


    比较讨厌的就是这类人,打着技术的幌子,行推销的勾当.

    此类帖子,如果你不是真的有疑问或者想热心帮人解答,而是故弄玄虚的广告贴,只能更让人厌烦,书有多烂不知道,但是此类的推销会让人对书的评估减分,这点是无益的.

    很多技术类的论坛,基本全是被这些广告贴搞跨的,这样的例子比比皆是.

2014年9月25日 09:39
0 0

明显的广告贴,一个人发帖,找几个人回帖,然后再伪装成书的作者回答问题,典型的一问一答,呵呵 ,低级

2014年9月26日 16:58
0 0

没想到这里被拿到提问了里面来了,不好意思给大家带来不好的影响,我是写这本书的人,或者叫人为某些东西可以分享的分享者,不算是真正的作者。

关于这个问题并不是本书的重点,我们只是通过这个小话题展开一些探讨和思考,逐步理解更多的东西。

关于3楼同学提到的+申请新的空间,这个要看情况,有些会涉及到编译时合并的问题。常规情况下会新分配空间,到底会多分配多少空间?以及空间到底是如何转换的,简单说它编译完成后有分配StringBuilder,最后toString出来的,分配的空间不止一块。

而常规情况下慢其实的关键不是分配空间部分,因为JVM现在的版本分配一个对象的时间是非常快的,导致的主要原因是循环中的分配会导致前一次循环的结果会变成垃圾,而且垃圾会越来越大,导致不断做GC的情况,随着垃圾越来越大,在经过Minor GC后Survivor空间放不下会直接进入Old区域,那么随之而来的就是不断FULL GC,这些可以将GC日志输出打印得到结论。StringBuilder本身在实现上也会发生扩容的问题,不过它最大的区别在于扩容后在下一轮循环的时候append的内容只要没有达到上限,数组就还可以继续复用,不会变成垃圾,不过它并不是没有优化的余地,它也有缺陷,从数据结构和空间上就能看得非常清楚(当然很多人不需要知道,所以也只是写给一部分人看的)。
当然还有很多细节这里肯定说不完,会在样章中说一说,证明这些结论的内容会在讲解JVM的章节联系起来讲,第一章只是说个大概而已,在后续讲解挺多内容的地方也会涉及到相关的问题和原因。为啥和这玩意较劲,一个是天天和他打交道,另一个是希望大家通过理解这种东西然后去逐步思考和理解更多的东西,如果仅仅着眼于这个点上,那么在这本书确实学不到什么,前言没有公布在PDF中是我的遗憾,其实在前言中有说明本书的阅读方法以及适合的人群,针对的人和写作目的。
最后我留下一些地址吧,以免大家在这个问题上继续纠结:
关于本书还有一些前言、第3、第5章的样章,可以在博客中找到,以及本书写作针对的人群,写作的目的和心态都在博客中存在,谢谢!
博客主地址:http://blog.csdn.net/xieyuooo
目录及下册要写的内容:http://blog.csdn.net/xieyuooo/article/details/38373409
前言(个人推荐,因为这个可以看出你是否适合此书以及如何阅读该书,文章头部是广告,可忽略):http://blog.csdn.net/xieyuooo/article/details/38612913
第3章的部分手稿(和实际书有点区别,但不大):http://blog.csdn.net/xieyuooo/article/details/17452383
第5章的部分手稿(同上,有点区别):http://blog.csdn.net/xieyuooo/article/details/17318131
CSDN勘误沟通:http://blog.csdn.net/xieyuooo/article/details/39339997
iteye勘误沟通:http://www.iteye.com/topic/1135477

2014年9月26日 00:01
0 0

太丧心病狂了吧,好多这书的广告。

2014年9月25日 14:16
0 0

String是定长的字符串,StringBuiler是可变字符串,书上都这么说,但是大家用的时候发现String明明是可以“+”的,StringBuiler无非是用append方法而已。事实上不是这样的,String使用“+”之后变成了一个新的字符串,内存中需要新开辟空间的,比如说String str1 = "abc"; str1 += str1;经过这个操作内存中会有两个字符串,一个是“abc”  另一个是“abcabc”,而StringBuiler使用append方法之后不会这样,所以说谁快谁慢,你能体会出来的

2014年9月25日 11:25
0 0

话说,这本书到底咋样~~~

2014年9月25日 09:57
0 0

现在广告都这样了。。。哎。。搞臭这本书的节奏么

2014年9月25日 09:48

相关推荐

    测试string的+和String.Format()和StringBuilder.Append()性能差距|TestForString.7z

    测试结果可能会显示,在大量连接操作中,`StringBuilder.Append()`的速度可能是`+`或`String.Format()`的数倍。 总结起来,当进行字符串操作时,应根据具体需求选择合适的方法。如果只是简单的字符串连接,`+`...

    jsonjar包及使用方式.zip

    在java开发中使用json... stringBuilder.append( jsobj.getString("mac")+",") .append(jsobj.getString("start")+",") .append(jsobj.getString("end")+",") .append(key+",").append( brandMap.get(key)+"\n");

    C# 拼接字符串的几种方式和性能

    StringBuilder.Append()会预先创建一个比较大的内存,以后每次操作时判断容量上限是否不够用,如果不够用就自动把容量扩大一倍,修改的还是第一次创建的对象的值。例如: ```csharp StringBuilder str = new ...

    从内存方面解释Java中String与StringBuilder的性能差异.docx

    这段代码在编译后会被转换成使用StringBuilder或StringBuffer的append方法,但由于String的不可变性,每次`+`操作都会生成新的String对象,这在大量拼接操作中会导致大量的内存分配和对象创建,效率较低。...

    C#导出CSV格式的代码

    sb.Append(StringUtil.ReplaceSpecialChars(model.TraceStart + "")).Append(","); sb.Append(StringUtil.ReplaceSpecialChars(model.TraceEnd + "")).Append(","); sb.Append(StringUtil.ReplaceSpecialChars...

    String ,StringBuffer与StringBuilder

    在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String 对象,就不能修改它的值。每次对 String 对象的...

    java.StringBuilder.md

    2. 效率:当需要对字符串进行多次修改时,使用StringBuilder比使用String的加号(+)拼接操作效率更高,因为String是不可变类,每次拼接都会创建一个新的String对象。 3. append()方法:StringBuilder类提供的append...

    C#源代码-StringBuilder.zip

    在.NET框架中,`StringBuilder`类是用于处理字符串的一个重要工具,尤其在需要频繁进行字符串操作,如拼接、插入、删除等场景下,它的效率远高于使用`+`或`string.Concat`方法。这个"C#源代码-StringBuilder.zip...

    Java的StringBuilder类.pdf

    与String类不同,StringBuilder是一个可变的对象,这意味着我们可以在已有的字符串基础上进行添加、删除、修改等操作,而无需创建新的字符串对象。这种特性在处理大量字符串拼接或动态构建字符串时非常有用,因为...

    Java StringBuffer & StringBuilder.pdf

    在Java编程语言中,`StringBuffer` 和 `StringBuilder` 是两个重要的类,它们主要用于处理可变的字符串。这两个类在很多方面都非常相似,但存在一些关键的区别。 **一、StringBuffer和StringBuilder的区别** 1. **...

    C#json操作

    StringBuilder Json = new StringBuilder(); Json.Append("{"); Json.Append("\"rows\":"); Json.Append("["); if (dt.Rows.Count > 0) { for (int i = 0; i < dt.Rows.Count; i++) { Json.Append("{");...

    StringBuilders.jl:Julia的StringBuilder类型

    StringBuilders 概述 建立String的简单类型。 用法如下: using StringBuilders sb = StringBuilder () append! (sb, " First string " ) append! (sb, " Second string " ) s = String (sb) 与使用IOBuffer相比...

    StringBuilder的用法.docx

    StringBuilder 类在 Java 中被广泛用于字符串的构建和操作,尤其在需要频繁进行字符串拼接时,StringBuilder 提供了显著的性能优势。相比 String 类,它不是不可变的,这意味着我们可以在一个 StringBuilder 实例上...

    String、StringBuffer、StringBuilder的使用方法

    在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`是处理字符串的三个重要类,它们各自有特定的使用场景和优缺点。理解它们的差异对于编写高效的代码至关重要。 **String类** `String`是不可变的类,...

    常用、经典算法及讲解 <img src="/images/sunny.gif" align="abs

    共享一下。不只这些,还有论文,网上down的。 1. 最小数字子串 2. 邮票面值 3. 字符移动 4. 子集定和问题 5. 素数方阵 6. 全排列问题 7. 移盘子问题 8. N 女王问题 9. 组合问题 10. 电子锁 11. 高精度数加减法 12....

    String和StringBuilder效率测试

    例如,可以创建一个包含大量字符串连接的操作,然后分别用`String`的`+`操作和`StringBuilder`的`append`方法执行,最后记录并比较两者的耗时。这样的测试可以帮助我们直观地看到,在频繁的字符串操作中,`...

    c#中把DataTable、Dataset转Json数据.docx

    public static string DataTableToJson1(string jsonName, DataTable dt) { StringBuilder Json = new StringBuilder(); Json.Append("{\"" + jsonName + "\":["); if (dt.Rows.Count &gt; 0) { for (int i = 0; i...

    java.StringBuilder(处理方案示例).md

    这是因为在循环中使用"+"操作符进行字符串拼接时,Java虚拟机会隐式地创建新的String对象,而StringBuilder则通过内部数组的方式动态地扩展字符串内容,无需为每次拼接都创建新的对象。例如,以下代码展示了如何使用...

    stringBuilder完整版.pdf

    StringBuilder.Append 将信息追加到当前 StringBuilder 的结尾。 StringBuilder.AppendFormat 用带格式文本替换字符串中传递的格式说明符。 StringBuilder.Insert 将字符串或对象插入到当前 StringBuilder 对象的...

    cs代码-测试string 加号与append速度

    总结来说,当需要频繁地对字符串进行拼接操作时,应优先考虑使用`StringBuilder`类的`Append()`方法,以提高程序性能。在处理大规模文本数据,例如日志记录、格式化输出或者构建复杂的动态SQL语句等场景,这个技巧...

Global site tag (gtag.js) - Google Analytics