Java中String和StringBuffer对于拼接运算中效率的对比

简介: Java中String和StringBuffer对于拼接运算中效率的对比 String类型在java中是immutable,意思就是不可变的,每次对String进行拼接操作,实际在jvm中都是new了一个新的String,随着String的new的次数越多,会造成虚拟机速度下降。

Java中String和StringBuffer对于拼接运算中效率的对比

String类型在java中是immutable,意思就是不可变的,每次对String进行拼接操作,实际在jvm中都是new了一个新的String,随着String的new的次数越多,会造成虚拟机速度下降。
StringBuffer的内部实际是一个字符数组,对于不同的jdk可以使用以下方法查看其实际的大小和容量(请参考下面的代码),注意:这是两个不同的概念,具体请参考API的文档。

String str1 = "redpig";
StringBuffer sb = new StringBuffer(str1);
System.out.println(sb.length()); //内容长度
System.out.println(sb.capacity());//总空间

如果每次随机生成10个字符(仅限于大小写字母和数字),重复10000次,此时可以清楚看到String和StringBuffer的运行效率。

import java.util.Random;

public class TestStrAndStrBuf {

    private static char[] characterPool = new char[62];

    static {
        char c = 0;
        int i = 0;
        for (c = 'a'; c < 'z'; c++, i++)
            characterPool[i] = c;
        for (c = 'A'; c < 'Z'; c++, i++)
            characterPool[i] = c;
        for (c = '0'; c < '9'; c++, i++)
            characterPool[i] = c;
    }

    public static void main(String[] args) {
        appendString(10000, 10);
        appendStringBuffer(10000, 10);
    }

    public static char[] getRandomCharacters(int charactersLength) {
        char[] chars = new char[charactersLength];
        Random r = new Random();
        for (int i = 0; i < charactersLength; i++)
            chars[i] = characterPool[Math.abs(r.nextInt()) % characterPool.length];
        return chars;
    }

    public static void appendString(int times, int charactersLength) {
        String string = new String();
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < times; i++)
            string += String.valueOf(getRandomCharacters(charactersLength));
        long endTime = System.currentTimeMillis();
        System.out.println("Run time is " + (endTime - startTime));
    }

    public static void appendStringBuffer(int times, int charactersLength) {
        StringBuffer stringBuffer = new StringBuffer();
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < times; i++)
            stringBuffer.append(getRandomCharacters(charactersLength));
        long endTime = System.currentTimeMillis();
        System.out.println("Run time is " + (endTime - startTime));
    }

}

不同的硬件和软件运行出来的结果有所区别,本机中的效果如下:

_

所以,针对字符频繁改动的应用中,请使用StringBuffer!

目录
相关文章
|
2月前
|
存储 Java
Java基础(二):原码、反码、补码及进制之间的运算
Java基础(二):原码、反码、补码及进制之间的运算
106 13
Java基础(二):原码、反码、补码及进制之间的运算
|
7天前
|
SQL IDE 算法
《从头开始学java,一天一个知识点》之:运算符与表达式:算术、比较和逻辑运算
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 这个系列为你打造Java「速效救心丸」,每天1分钟,地铁通勤、午休间隙即可完成学习。直击高频考点和实际开发中的「坑位」,拒绝冗长概念,每篇都有可运行的代码示例。明日预告:《控制流程:if-else条件语句实战》。
26 6
|
4月前
|
安全
String、StringBuffer、StringBuilder的区别
String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。 StringBuffer可变并且线程安全;有一定缓冲区容量,字符串大小没超过容量,不会重新分配新的容量,适合多线程操作字符串; StringBuiler可变并且线程不安全。速度比StringBuffer更快,适合单线程操作字符串。 操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer
|
4月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
80 6
|
6月前
|
安全 Java
String、StringBuffer、StringBuilder的区别
这篇文章讨论了Java中String、StringBuffer和StringBuilder的区别。String是不可变的,每次操作都会产生新的对象,效率低且浪费内存。StringBuilder可以在原字符串基础上进行操作,不开辟额外内存,弥补了String的缺陷。StringBuffer和StringBuilder类似,但StringBuffer的方法是线程安全的。文章还列举了StringBuffer的常用方法,并提供了使用示例代码。最后总结了这三者的主要区别。
String、StringBuffer、StringBuilder的区别
|
5月前
|
存储 安全 Java
String、StringBuffer 和 StringBuilder 的区别
【10月更文挑战第21天】String、StringBuffer 和 StringBuilder 都有各自的特点和适用场景。了解它们之间的区别,可以帮助我们在编程中更合理地选择和使用这些类,从而提高程序的性能和质量。还可以结合具体的代码示例和实际应用场景,进一步深入分析它们的性能差异和使用技巧,使对它们的理解更加全面和深入。
115 0
|
6月前
|
算法 Oracle Java
Java字符串拼接技术演进及阿里巴巴的贡献
本文主要讲述了Java字符串拼接技术的演进历程,以及阿里巴巴贡献的最新实现 PR 20273。
198 11
|
6月前
|
算法 Oracle Java
Java字符串拼接技术演进及阿里巴巴的贡献
本文主要讲述了Java字符串拼接技术的演进历程,以及阿里巴巴贡献的最新实现 PR 20273。
142 12
|
6月前
|
JavaScript 前端开发
今天被JavaScript的String型和数字型的+运算撞了一下腰。
今天被JavaScript的String型和数字型的+运算撞了一下腰。
|
7月前
|
安全 Java 编译器
【Java基础面试二十九】、说一说你对字符串拼接的理解
这篇文章讨论了Java中字符串拼接的四种常用方式(使用`+`运算符、`StringBuilder`、`StringBuffer`和`String`类的`concat`方法),每种方式适用的场景,以及在不同情况下的性能考量。