jjzjj

StringBuilder类

zh-Note 2023-04-16 原文

StringBuilder类

一、结构剖析

  1. 一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步(StringBuilder 不是线程安全的)。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer要快。
  2. 在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。
//StringBuilder类细节:
public class StringBuilder01 {
    public static void main(String[] args) {
        //1. StringBuilder 继承 AbstractStringBuilder 类
        //2. 实现了 Serializable 接口,说明StringBuilder对象是可以串行化(对象可以网络传输,可以保存文件)
        //3. StringBuilder 是 final类,不能被继承
        //4. StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder 的 char[] value;
        //5. StringBuilder 的方法,没有做互斥的处理,即没有synchronized 关键字,因此在单线程的情况下使用StringBuilder
        StringBuilder stringBuilder = new StringBuilder();

    }
}

二、StringBuilder常用方法

StringBuilder 和 StringBuffer 均代表可变的字符序列,方法是一样的,所以使用和StringBuffer一样。

三、StringBuilder应用

  • String、StringBuffer 和 StringBuilder 的比较

    1. StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且方法也一样

    2. String:不可变字符序列,效率低,但是复用率高。

    3. StringBuffer:可变字符序列,效率较高(增删),线程安全。

    4. StringBuilder:可变字符序列,效率最高,线程不安全。

    5. String使用注意说明:

      String s = "a";:创建了一个字符串

      s += "b";:实际上原来的 "a" 字符串对象已经丢弃了,现在又产生了一个字符串 s + "b" (也就是"ab")。如果多次执行这些改变内容的操作,会导致大量副本字符串对象留在内存中,降低效率。如果这样的操作放在循环中,会极大影响程序的性能。结论:如果我们对 String 做大量的修改,不要使用String。

  • String、StringBuffer和StringBuilder的效率测试

    效率:StringBuilder > StringBuffer > String

    public class StringVsStringBufferVsStringBuilder {
        public static void main(String[] args) {
            long startTime = 0L;
            long endTime = 0L;
            StringBuffer buffer = new StringBuffer("");
            startTime = System.currentTimeMillis();
    
            for (int i = 0; i < 80000; i++) {//StringBuffer
                buffer.append(String.valueOf(i));
            }
            endTime = System.currentTimeMillis();
            System.out.println("StringBuffer的执行时间:" + (endTime - startTime));
    
    
            StringBuilder builder = new StringBuilder("");
            startTime = System.currentTimeMillis();
            for (int i = 0; i < 80000; i++) {//StringBuilder
                builder.append(String.valueOf(i));
            }
            endTime = System.currentTimeMillis();
            System.out.println("StringBuiler的执行时间:" + (endTime - startTime));
    
            String text = "";
            startTime = System.currentTimeMillis();
            for (int i = 0; i < 80000; i++) {//StringBuilder
                text = text + i;
            }
            endTime = System.currentTimeMillis();
            System.out.println("String的执行时间:" + (endTime - startTime));
        }
    }
    //运行结果:
    //StringBuffer的执行时间:12
    //StringBuiler的执行时间:5
    //String的执行时间:3695
    
  • String、StringBuffer和StringBuilder的选择

    使用原则,结论:

    1. 如果字符串存在大量的修改操作,一般使用 StringBuffer 或 StringBuilder
    2. 如果字符串存在大量的修改操作,并且在单线程的情况,使用StringBuileder
    3. 如果字符串存在大量的修改操作,并且在多线程的情况,使用StringBuffer
    4. 如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等

有关StringBuilder类的更多相关文章

  1. java - StringBuilder 和 ResultSet 性能问题的可能原因是什么 - 2

    我正在用Java循环遍历结果集;出于测试目的,它返回大约30行,每行17列(所有字符串数据)。我正在使用StringBuilder从结果中手动构建一个XML字符串,并且循环完成这些迭代实际上需要大约36秒。注意:我意识到这不是从数据库中获取XML的最佳方式,甚至不是从结果集中获取XML的最佳方式-但无论如何这都让我对缓慢的性能感到好奇。更新:根据目前的回复,我必须解决以下问题:运行查询的时间不到一秒,我在代码的每个部分前后都执行了System.currentTimeMillis()以缩小范围。36秒完全在下面的代码中。ResultSetMetaDatarsmeta=rset.getMe

  2. C# 从 StringBuilder 解析 Xml - 2

    我有一个包含XML文件内容的StringBuilder。在XML文件中有一个名为的根标签。并包含多个标签。我想通过XML进行解析以读取s中的标签值,但不确定该怎么做。我必须为此使用一些C#XML数据类型吗?提前致谢 最佳答案 StringBuildersb=newStringBuilder(xml);TextReadertextReader=newStringReader(sb.ToString());XDocumentxmlDocument=XDocument.Load(textReader);varnodeValueList=f

  3. c# - StringBuilder 还是 XMLDocument? - 2

    我编写了一个控制台应用程序来从Web服务器获取一些信息,将其转换为XML并保存。我手动创建了XML(使用StringBuilder附加字符串)。由于XML可能非常大,就内存而言,使用StringBuilder或XMLDocument类等更好吗?准确地说,我的问题是,如果XML类似于10mb文本,使用StringBuilder.append("")或System.XML命名空间是否具有内存效率?我认为更有效的方法是使用StringBuilder,但在每次迭代后将XML保存到HD上的文件并清除stringbuilder对象。任何意见?提前致谢。:) 最佳答案

  4. c# - StringBuilder 与 XmlTextWriter - 2

    我正在尝试从提供Xml内容的自定义HttpHandler中尽可能多地发挥性能。我想知道哪个对性能更好。使用XmlTextWriter类或临时StringBuilder操作,例如:StringBuildersb=newStringBuilder("");sb.AppendFormat("{0}",SOMEVALUE);有没有人有第一手经验? 最佳答案 正如Josh所说,这是一个微优化,如果您还没有证明它的必要性,您甚至不应该考虑它。它也确实不难测试:staticvoidMain(string[]arguments){constinti

  5. c# - 在 C# 中,检查 stringbuilder 是否包含子字符串的最佳方法 - 2

    我有一个现有的StringBuilder对象,代码向它附加了一些值和一个分隔符。我想修改代码以添加逻辑,在附加文本之前,它将检查它是否已存在于StringBuilder中。如果没有,它只会追加文本,否则将被忽略。这样做的最佳方法是什么?我需要将对象更改为string类型吗?我需要不会影响性能的最佳方法。publicstaticstringBuildUniqueIDList(contextRequestContext){stringrtnvalue=string.Empty;try{StringBuilderstrUIDList=newStringBuilder(100);for(int

  6. c# - 如何实现 StringBuilder 和/或调用 String.FastAllocateString? - 2

    我很想知道我是否可以创建一个优化版本的StringBuilder(尝试稍微加快它的速度,因为它目前是我的一个应用程序的瓶颈)。对我来说不幸的是,它似乎利用了我无法使用(或者看起来如此)的“神奇”系统调用。反编译System.Text.StringBuilder的源代码后,我注意到它使用了以下内部(因此无法调用)系统调用:[SecurityCritical][MethodImpl(MethodImplOptions.InternalCall)]internalstaticstringFastAllocateString(intlength);还有这个未记录的属性被大量使用:[ForceT

  7. c# - 从异步方法将字符串添加到 StringBuilder - 2

    我有返回字符串的异步方法(来自网络)。asyncTaskGetMyDataAsync(intdataId);我有:Task[]tasks=newTask[max];for(inti=0;i如何将每个任务的结果附加到StringBuilder?我想知道怎么做A)按照任务创建的顺序B)为了完成任务我该怎么做? 最佳答案 A)InorderoftaskcreationTask[]tasks=newTask()[max];for(inti=0;iB)InorderthattasksfinishTask[]tasks=newTask()[ma

  8. c# - 是否有 System.Text.StringBuilder 的二进制等价物? - 2

    我在C#中连接大量byte[]数组。如果我对字符串执行此操作,我会使用StringBuilder——是否有适用于byte[]数组中的二进制数据的等效类? 最佳答案 我不认为有一个完全等价的东西,但你可以用BinaryWriter来完成它:http://msdn2.microsoft.com/en-us/library/system.io.binarywriter.aspxMemoryStreamm=newMemoryStream();BinaryWriterwriter=newBinaryWriter(m);writer.Write

  9. c# - 如何用零删除 StringBuilder 内存 - 2

    我在StringBuilder对象中存储了一个密码。我正在寻找一种方法来删除内存中的密码。以下任何一种方法都可以实现这一点:遍历StringBuilder字符并分配'\0'。是如果我已经分配,​​这保证使用相同的内存最初有足够的内存吗?我可以使用任何非托管API,例如ZeroMemory()或SecureZeroMemory()使用StringBuilder?有代码示例吗?编辑:使用SecureString不是我的选择,因为我正在调用CredUIPromptForCredentials()来获取凭据。 最佳答案 简单的答案是,您提出

  10. c# - 为什么 StringBuilder 比字符串连接慢? - 2

    为什么StringBuilder比+连接更慢?StringBuilder旨在避免创建额外的对象,但为什么会降低性能?staticvoidMain(string[]args){intmax=1000000;for(inttimes=0;times编辑:按照建议移出范围变量: 最佳答案 更改以便StringBuilder不会一直实例化,而是.Clear()它:time:1String+:3348msStringBuilder:3151mstime:2String+:3346msStringBuilder:3050ms等请注意,这仍然会测

随机推荐