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

问题描述

如果不知道而想知道就去看java特种兵这本书,讲的很透彻

解决方案

比较讨厌的就是这类人,打着技术的幌子,行推销的勾当. 此类帖子,如果你不是真的有疑问或者想热心帮人解答,而是故弄玄虚的广告贴,只能更让人厌烦,书有多烂不知道,但是此类的推销会让人对书的评估减分,这点是无益的. 很多技术类的论坛,基本全是被这些广告贴搞跨的,这样的例子比比皆是.
解决方案二:
明显的广告贴,一个人发帖,找几个人回帖,然后再伪装成书的作者回答问题,典型的一问一答,呵呵 ,低级
解决方案三:
没想到这里被拿到提问了里面来了,不好意思给大家带来不好的影响,我是写这本书的人,或者叫人为某些东西可以分享的分享者,不算是真正的作者。关于这个问题并不是本书的重点,我们只是通过这个小话题展开一些探讨和思考,逐步理解更多的东西。关于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/17318131CSDN勘误沟通:http://blog.csdn.net/xieyuooo/article/details/39339997iteye勘误沟通:http://www.iteye.com/topic/1135477
解决方案四:
太丧心病狂了吧,好多这书的广告。
解决方案五:
String是定长的字符串,StringBuiler是可变字符串,书上都这么说,但是大家用的时候发现String明明是可以“+”的,StringBuiler无非是用append方法而已。事实上不是这样的,String使用“+”之后变成了一个新的字符串,内存中需要新开辟空间的,比如说String str1 = "abc"; str1 += str1;经过这个操作内存中会有两个字符串,一个是“abc” 另一个是“abcabc”,而StringBuiler使用append方法之后不会这样,所以说谁快谁慢,你能体会出来的
解决方案六:
话说,这本书到底咋样~~~
解决方案七:
现在广告都这样了。。。哎。。搞臭这本书的节奏么

时间: 2024-10-03 19:33:06

String 的“+”操作一定比 StringBuilder.append()慢吗的相关文章

String的+操作(如"a"+"b")在什么情况下不比StringBuffer的append操作效率低

问题描述 String的+操作(如"a"+"b")在什么情况下不比StringBuffer的append操作效率低这个问题确实头疼,找不到答案,放在论坛上讨论一下吧 解决方案 String c="a" + "b";//编译优化成String="ab" 比StringBuffer高直接String c= a+b;//编译成String c=new StringBuilder(a).append(b).toSt

string的操作

除了顺序容器共有的操作之外,string类型还提供了一些额外的操作.这些操作中的大部分要么是提供string类和C风格字符数组之间的相互转换,要么是增加了允许我们用下标代替迭代器的版本.   构造string的其他方法 除了前面的介绍的关于string的操作http://www.cnblogs.com/wuchanming/p/3887564.html,下面介绍string的其他方法: 构造string的其他方法 n.len2和pos2都是无符号值 string s(cp,n)  s是cp指向的

Python中操作列表之List.append()方法的使用

  这篇文章主要介绍了在Python中操作列表之List.append()方法的使用,是Python入门学习中的基础知识,需要的朋友可以参考下 append()方法追加传递obj到现有的列表. 语法 以下是append()方法的语法: ? 1 list.append(obj) 参数 obj -- 这是在列表中要追加的对象. 返回值 此方法不返回任何值,但更新现有的列表. 例子 下面的例子显示了append()方法的使用. ? 1 2 3 4 5 #!/usr/bin/python   aList

c++-string流操作不能和cin操作混用吗?

问题描述 string流操作不能和cin操作混用吗? #include #include #include #include using namespace std; int main() { string str; string name, number; int num; while(getline(cin, str)) { istringstream record(str); record >> name >> number; cout << "stri

STL之multiset中equal_range,multimap中的equal_range,bitset容器,string字符串操作,lambda表达式

 1multiset中用equal_range来遍历所有的元素 #include <set> #include <iostream> using namespace std;   //multiset中存储的元素是不重复的 void main() {     multiset<int> myset;     myset.insert(100);     myset.insert(101);     myset.insert(100);     myset.inser

python中string的操作函数

在python有各种各样的string操作函数.在历史上string类在python中经历了一段轮回的历史.在最开始的时候,python有一个专门的string的module,要使用string的方法要先import,但后来由于众多的python使用者的建议,从python2.0开始, string方法改为用S.method()的形式调用,只要S是一个字符串对象就可以这样使用,而不用import.同时为了保持向后兼容,现在的 python中仍然保留了一个string的module,其中定义的方法

asp.net string常用操作(1/2)

string s = string.empty; string s = ""; string s = null; 第一种第一一个指向空字符串的字符串变量, s不占用存储空间.s变量可以使用,比如s.length . 第二种定义一个指向""的空字符串, 占用一个字节存储空间,因为转义符代表字符串结束.s变量可以使用,比如s.length 第三种定义一个指不向任何一个存储空间的变量,s不可以使用 字符串连接: ------------------------------

《Java特种兵》1.1 String的例子,见证下我们的功底

本文是<Java特种兵>的样章感谢博文视点和作者授权本站发布 1.1 String的例子见证下我们的功底 哇塞第1节就开始讲代码例子受不了啦胖哥你坏死了所有的书第1节都是写这个领域有什么东西的. 哈哈小胖哥天生就是个逆天之人哦希望你能先实践有了感性认识后再进行理论了解内在. 下面的代码改编于网络牛人的一段程序先看代码清单1-1. 代码清单1-1 一段String的比较程序 private static void test1() { String a = "a" + &quo

一年纯手工打造的Java老A上册开始预售了

Java老A这本书写了很久昨天终于开始在china-pub.京东.天猫上开始预售了不过既然叫预售就肯定还没到货. 有兴趣的人可以去看看哈后续其它网站地址也会在这里公开 china-pub http://search.china-pub.com/s/?key1=java%cc%d8%d6%d6%b1%f8&type=&pz=1 京东 http://search.jd.com/Search?keyword=Java%E7%89%B9%E7%A7%8D%E5%85%B5&enc=utf-