资讯专栏INFORMATION COLUMN

String, StringBuffer和StringBuilder

cartoon / 2821人阅读

摘要:在中,是不可变类型,所以对于字符串的操作提供了两个辅助类和。考虑如下代码在利用直接进行拼接时,每次循环都会生成一个新的对象,也就是说等同这样运行的效率明显是低于显式调用的。

在Java中,String是不可变类型,所以对于字符串的操作提供了两个辅助类:StringBuffer和StringBuilder。

这个两个类的主要区别在于:

StringBuilder的效率更高

StringBuffer是线程安全的,而StringBuilder不是

不过,需要注意的是,在利用+对String对象直接进行拼接的时候,Java内部其实还是用StringBuilder来实现的,但是和显式地调用StringBuilder略有区别。

考虑如下代码:

javaString[] strings = new String[]{"one", "two", "three", "four", "five"};
String resultStr = "";
StringBuilder resultBuilder = new StringBuilder();
for (int i = 0; i < strings.length; i++) {
    resultStr += strings[i];
}
for (int i = 0; i < strings.length; i++) {
    resultBuilder.append(strings[i]);
}

在利用+直接进行拼接时,每次循环都会生成一个新的StringBuilder对象,也就是说等同:

javaStringBuilder stringBuilder = new StringBuilder(resultStr);
stringBuilder.append(strings[i]);
resultStr = stringBuilder.toString();

这样运行的效率明显是低于显式调用StringBuilder的。

但是在有一种情况下,利用+拼接的速度会远远快于用StringBuilder或者StringBuffer,考虑如下代码:

javaString str = "one" + "two" + "three";
StringBuilder strBuilder = new StringBuilder().append("one").append("two").append("three");

在这种情况下,JVM会直接把String str = "one" + "two" + "three";理解为String str = "onetwothree”;,也就说不需要像通常情况下生成StringBuilder对象然后再拼接,速度自然快很多。不过需要强调的一点是,当然字符串来自其他对象的时候,JVM不会做这种特殊处理,也就说如下代码:

javaString one = "one";
String two = "two";
String three = "three";
String str = one + two + three;

效率仍然是非常低的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64293.html

相关文章

  • StringStringBuilder、StringBuffer的爱恨情仇

    摘要:当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用而不用的,就是速度的原因。 第三阶段 JAVA常见对象的学习 StringBuffer和StringBuilder类 (一) StringBuffer类的概述 (1) 基本概述 下文以StringBuffer为例 前面我们用字符串做拼接,比较耗时并且也耗内存(每次都会构造一个新的string对象),而这种拼接操作又...

    stormjun 评论0 收藏0
  • StringStringBuilder、StringBuffer 拼接测试

    摘要:测试拼接速度测试的结果在循环中,拼接字符串的速度远低于和利用查看字节码文件,寻找其中的差异命令行执行结果可以看出,拼接的时候也是通过的方法进行拼接的产生差异的原因是,在每次循环中,拼接的时候都了一个是线程安全的,只比稍慢了一点若不是 String、StringBuilder、StringBuffer 测试拼接速度 @Test public void testString() { ...

    20171112 评论0 收藏0
  • StringString / StringBuffer / StringBuilder 三者的功能

    摘要:不指定容量会显著降低性能一般使用在方法内部来完成类似功能,因为是线程不安全的,所以用完以后可以丢弃。主要用在全局变量中相同情况下使用相比使用仅能获得左右的性能提升,但却要冒多线程不安全的风险。 String 作为最基础的引用数据类型,日常的开发中被大量的使用。基于不可变的特性,一旦被过度地使用,堆内存就会负荷不堪,甚至影响性能,为此,Java 设计者特意为 String 在方法区中开辟...

    icattlecoder 评论0 收藏0
  • 面试题:Stirng、StringBuffer、StringBuilder

    摘要:如果对于经常改变内容的字符串,使用效率高,但是它只适用于单线程的场景,在多线程场景下,容易导致数据不一致的现象出现。多线程场景下,要使用。在大部分情况下,线程安全的可变字符序列。可将字符串缓冲区安全地用于多个线程。 本人博客 http://www.cnblogs.com/runfor... 总结: 1.String是字符串常量,StringBuffer是线程安全的字符串变量,Stri...

    zhoutk 评论0 收藏0
  • Java StringBuilderStringBuffer源码分析

    摘要:是可以序列化的标志。构造器可以看出,默认的容量大小为。不过这个构造器是具有包访问权限,一般情况下是不能调用的。总结和都是可变字符串,前者线程不安全,后者线程安全。和的大部分方法均调用父类的实现。其扩容机制首先是把容量变为原来容量的倍加。 简介 StringBuilder与StringBuffer是两个常用的操作字符串的类。大家都知道,StringBuilder是线程不安全的,而Stri...

    wangbjun 评论0 收藏0
  • Java中的StringStringBuilder,StringBuffer三者的区别

    摘要:所以如果要进行的操作是多线程的,那么就要使用,但是在单线程的情况下,还是建议使用速度比较快的。总结一下适用于少量的字符串操作的情况适用于单线程下在字符缓冲区进行大量操作的情况适用多线程下在字符缓冲区进行大量操作的情况 [TOC] 原文链接:[https://www.cnblogs.com/su-fe...]: 这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面 1、首先说...

    tinna 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<