`
francis.xjl
  • 浏览: 16620 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

关于String累加

阅读更多
昨天在群里跟人讨论关于String累加的问题,貌似没有人能特别准确的知道是一个什么样的情况,今天我通过jclasslib (PS:从http://zangxt.iteye.com/搞到的好东西)来检测一下编译器是如何进行字符串累加的,我们先写一段代码:
package francis;  
public class TestString {  
    public static void main(String[]args) {  
        String s = "";  
        for(int i = 0; i < 1000; i++) {  
            s += i;  
        }  
        System.out.println(s);  
    }  
}  

很简单,貌似网上也能给出一个大概的结论,但是我们还是亲手看一下编译后的代码:

我们可以看到上面的程序被编译成了22行的代码,我们注意看一下第6行到第18行,这是整个for循环所执行的代码,我们会很明显的看到,每次循环都会执行第6行的代码,也就是每次都会新建了一个StringBuilder对象,这多么浪费性能啊。

这就很明显了,每一次字符串的拼接,编译器都是通过新建StringBuilder对象来完成的。

哎,如果编译器足够智能,将新建StringBuilder对象放到循环之外,就不用我们去操心性能问题,但是,貌似目前编译器还办不到。所以我们手动的新建StringBuilder是比较好的方案:
package francis;  
public class TestString {  
    public static void main(String[]args) {  
        String s = "";  
        StringBuilder sb = new StringBuilder(s);  
        for(int i = 0; i < 1000; i++) {  
            sb.append(i);  
        }  
        s = sb.toString();  
        System.out.println(s);  
    }  
}  

为了确定是否真的达到效果,我们来看一下这次编译后的代码:

这次循环的代码是在11~18行,而创建StringBuilder对象是在第三步执行。这样就避免了编译器会每个循环都新建一个StringBuilder对象了。比较好的习惯就是当连接字符串操作比较多的时候直接手动新建StringBuilder对象.

那有人可能会问了,String的每次拼接都是利用创建StringBilder对象来处理么? 实践乃检验真理的唯一方法:

先写代码:
package francis;  
public class TestString {  
    public static void main(String[]args) {  
        String a = "a" + "b" + "c";  
        String b = a + "b";  
        String c = a + b;  
        System.out.println(a + b + c);  
    }  
} 

然后再看一下编译后的结果,由于比较长,我分成两张图片:


很显然,有四个new StringBuilder操作。基本可以得出结论:需要字符串连接的时候,如果没有可用的对应的StringBuilder就会去新建。因此字符串操作还是推荐自己手动去new StringBuilder,不能依赖编译器的优化。

当然会有很多其它情况,比如我在第三行代码后面加一个c+=a;a+=b;会产生什么样的情况呢?实践乃检验真理的唯一方法,自己去检测吧~~
分享到:
评论

相关推荐

    字符串数组转换成string类型的

    `stringstream`允许你将一个字符串流当作输入/输出流来处理,而`accumulate`则可以用来累加容器中的元素。例如,你可以这样做: ```cpp #include #include #include &lt;string&gt; #include std::vector&lt;std::...

    jquery 数字累加特效

    可能需要使用到 JavaScript 的字符串处理函数,如 `String.prototype.padStart()` 或第三方库(如 `numeral.js` 或 ` accounting.js`),确保数字始终带有前导零,以维持固定长度。 3. **`jquery.animateNumber.js`...

    Spark2中使用累加器、注意点以及实现自定义累加器.docx

    def main(args: Array[String]): Unit = { val sparkSession = SparkSession.builder() .appName("MyAccumulate") .master("local[2]") .getOrCreate() val sc = sparkSession.sparkContext val ...

    spark 累加器,广播变量.docx

    Spark 累加器和广播变量 Spark 是一个基于内存的分布式计算框架,具有高效、灵活、可扩展等特点。Spark 中的数据结构主要有三种:RDD、累加器和广播变量。本文将对这三种数据结构进行详细介绍。 一、RDD...

    hashString

    对于字符串,可以使用字符的ASCII值累加、异或或者位操作等方式。 - **冲突解决**:哈希表需要处理哈希碰撞,常见的方法有开放寻址法和链地址法。开放寻址法是当哈希冲突时,寻找下一个空的哈希槽;链地址法则是每个...

    c#累加1+100

    在C#编程语言中,"累加"是一个基本的数学概念,它涉及到将一系列数字相加以获得它们的总和。在这个场景下,"c#累加1+100"意味着我们需要编写一个C#程序,该程序计算从1到100的所有整数的总和。下面我们将深入探讨这...

    NoSQL数据库之Redis数据库管理三(string类型和hash类型)

    例如,你可以通过INCR命令轻松地对用户访问计数进行累加。 接下来,我们探讨Hash类型。Hash是一种将多个字段(Field)与对应的值(Value)存储在一起的数据结构,非常适合表示对象。在Redis中,每个Hash可以包含...

    为JavaScript中的String添加一些常用方法

    这个方法通过循环将字符串累加指定次数,达到重复的效果。 这些自定义方法极大地丰富了String对象的功能,使得在处理字符串时更加便捷。在实际开发中,这样的工具函数库可以提高代码的可读性和复用性。通过阅读`...

    convert string to integer

    4. 转换过程:将数字字符转换为其对应的整数值,并累加。 5. 错误处理:如果遇到非数字字符,抛出异常或返回特定值。 在实际应用中,编写自定义的转换方法可能是因为性能需求、特定的错误处理机制或对现有方法功能...

    StringToInt

    ### 字符串转换为整数(StringToInt) 在计算机编程领域中,经常需要将字符串转换成数字以便进行数值计算或处理。本篇文章介绍了一个简单的字符串转整数的方法,并通过一个具体的示例函数来阐述这一过程。 #### ...

    string类函数的c实现

    从给定的代码片段和描述来看,我们正在探讨C语言中字符串处理函数的实现细节,这些函数在标准库`&lt;string.h&gt;`中被定义。让我们深入解析这些函数,包括`strcpy()`, `strcat()`, `strcmp()`, `strlen()`, `strrchr()`...

    !实例研究:字符串类String.rar_字符串类_类String重载

    `+=`操作符就是其中之一,通常用于累加赋值,比如在整型或浮点型变量中增加一个值。然而,在`std::string`中,`+=`被重载用于字符串连接,这使得我们可以方便地将两个字符串合并成一个新的字符串。 例如,如果我们...

    java累加和校验实现方式16进制(推荐)

    java累加和校验实现方式16进制(推荐) 在信息技术领域,数据校验是确保数据完整性和准确性的关键环节。本文将重点介绍如何使用Java语言实现16进制累加和校验的一种有效方式。Java作为一种广泛使用的编程语言,它在...

    Spark自定义累加器的使用实例详解

    在Spark中,累加器是用于并行操作中的一种特殊的共享变量,主要用途是在分布式任务执行过程中对数据进行累加操作。累加器可以用于调试目的,比如事件计数、求和和平均值计算等。在Spark中,累加器是单向的,只能在...

    C语言string类的实现

    它通过遍历整个字符串直到遇到`\0`,并累加计数器来完成。 3. **字符串复制** - `strcpy` ```c char* strcpy(char *to, const char *from) { assert((to != NULL) && (from != NULL)); char *result = to; ...

    StringCalculator:TDD StringCalculator卡塔

    这时,我们需要更新测试用例,如`assertThat(StringCalculator.add("1,2"), equalTo(3))`,然后编写相应的代码,可能是通过split()方法将字符串分割,再逐一累加数字。 在每次迭代中,我们都会遵循相同的红-绿-重构...

    python 开发简易数字累加器demo源码+注解清晰一看就懂.zip

    Python是一种广泛使用的高级编程语言...以上就是关于Python开发简易数字累加器的基本知识。通过这个示例,你可以了解到Python的基本语法、函数定义、参数传递、循环控制以及输入输出操作。希望对你学习Python有所帮助!

    achieve-the-hex-string-to-decimal-.rar_hex string to hex

    标题中的"achieve-the-hex-string-to-decimal-.rar_hex string to hex"明确指出我们要探讨的是关于十六进制字符串(Hex String)转换为十进制数(Decimal)的问题。描述中提到的实现长度小于N个字符的十六进制字符串...

    dashuchengfa.rar_DaShuChengFa_大数 string

    本知识点主要探讨如何使用C语言实现大数乘法,尤其是在处理超过普通整型范围的大整数时,通过字符串(string)来存储和操作这些大数。 首先,我们要理解C语言中的基本数据类型如int、long等无法直接处理大数,因为...

    VB源代码天数累加

    在VB(Visual Basic)编程环境中,我们可以创建源代码来实现各种功能,其中之一就是记录和累加特定事件或状态的天数。"VB源代码天数累加"这个项目旨在自动跟踪并更新一个系统的“安全天数”。这通常用于工作场所的...

Global site tag (gtag.js) - Google Analytics