标签: stringbuilder

.NET 的线程安全缓冲区

(注意:虽然我想了解 .Net 4.0 的未来想法,但该项目仅限于 .Net 3.5。)

我有一个线程,它从外部设备异步读取数据(在代码示例中由非常有创意的 strSomeData 模拟:-)并将其存储在 StringBuilder“缓冲区”中(strBuilderBuffer :-)

在“主代码”中,我想“蚕食”这个“缓冲区”。但是,从“操作”的角度来看,我不确定如何以线程安全的方式执行此操作。我理解从“数据”角度来看它是安全的,因为根据 msdn,“此 ( StringBuilder) 类型的任何公共静态成员都是线程安全的。任何实例成员都不能保证是线程安全的。” 但是,我下面的代码说明从“操作”角度来看它可能不是线程安全的。

关键是我担心两行代码:

string strCurrentBuffer = ThreadWorker_TestThreadSafety_v1a.strBuilderBuffer.ToString();
// Thread 'randomly' slept due to 'inconvenient' comp resource scheduling...
ThreadWorker_TestThreadSafety_v1a.strBuilderBuffer.Length = 0;
Run Code Online (Sandbox Code Playgroud)

如果计算机操作系统在缓冲区的“读取”和缓冲区的“清除”之间让我的线程休眠,我可能会丢失数据(这很糟糕:-(

有没有办法保证“原子性”?这两行并强制计算机不中断它们?

关于弗拉德下面关于使用 的建议lock,我尝试过,但没有成功(真的):

    public void BufferAnalyze()
    {
        String strCurrentBuffer;
        lock (ThreadWorker_TestThreadSafety_v1a.strBuilderBuffer)
        {
            strCurrentBuffer = ThreadWorker_TestThreadSafety_v1a.strBuilderBuffer.ToString();
            Console.WriteLine("[BufferAnalyze()]  ||<<  Thread 'Randomly' Slept due to comp resource scheduling");
            Thread.Sleep(1000);  //  Simulate poor timing of thread resourcing...
            ThreadWorker_TestThreadSafety_v1a.strBuilderBuffer.Length = 0;
        }
        Console.WriteLine("[BufferAnalyze()]\r\nstrCurrentBuffer[{0}] == {1}", strCurrentBuffer.Length.ToString(), …
Run Code Online (Sandbox Code Playgroud)

c# stringbuilder buffer thread-safety .net-3.5

4
推荐指数
1
解决办法
7813
查看次数

StringBuilder.toString 是否保留构建的字符串?

我正在创建一个 StringBuilder 来收集我定期刷新到服务器的字符串。如果刷新失败,我想保留这些字符串以便下次再试,但同时我可能会收到额外的字符串,这些字符串必须添加到 StringBuilder。

我想知道最有效的方法是什么,因为这是在 Android 应用程序中完成的,其中电池使用情况和 CPU 使用情况是一个大问题。调用 StringBuilder 的 toString() 函数是否会存储它在内部返回的结果字符串,以便后续调用不必执行复制所有原始字符串的工作?或者,如果调用失败,我是否应该创建一个新的 StringBuilder,并使用 toString() 的返回值进行初始化?

java stringbuilder android

4
推荐指数
1
解决办法
2159
查看次数

每次调用 StringBuffer#toString 和 StrinBuilder#toString 都会从字符串池中返回新实例还是实例?

我的问题是我是否使用 StringBuffer(或 StringBuilder),以及我是否多次在实例上调用 toString 方法。StringBuffer 每次都会返回新的 String 实例还是从 String 池中返回 String?(假设我在两次调用之间没有对 StringBuffer 进行任何更改)

java string stringbuilder stringbuffer

4
推荐指数
1
解决办法
1687
查看次数

在 Java 8 中用于连接的“+”运算符被 new StringBuilder() 取代

在 Java 8 中,我编写了一些示例代码。

String s1 = "Hello";  
String s2 = "world";  
String s3 = s1 + s2;  
Run Code Online (Sandbox Code Playgroud)

反编译 .class 文件后,我发现了第三条语句

 String s3 = s1 + s2;  
Run Code Online (Sandbox Code Playgroud)

取而代之

 String s3 = new StringBuilder(s1).append(s2).toString();
Run Code Online (Sandbox Code Playgroud)

这是否意味着不再需要使用显式 StringBuilder 进行优化而只需使用“+”运算符而不是?

java string optimization stringbuilder

4
推荐指数
1
解决办法
3938
查看次数

为什么在连接中 String 比 StringBuilder 更好?

我下面的方法需要返回一个由字符串连接而成的字符串。

StringBuilder sb = new StringBuilder();
sb.append("count: ").append(this.count()).append( "\n");

return sb.toString();
Run Code Online (Sandbox Code Playgroud)

在 IntelliJ 中,代码检查建议我用如下所示的字符串替换此 StringBuilder:

String sb = "count: " + this.count() + "\n";
return sb
Run Code Online (Sandbox Code Playgroud)

我的印象是 StringBuilder 应该与append方法一起使用,以用加号替换字符串连接。这个代码检查建议在 IntelliJ 中有意义吗?

string stringbuilder intellij-idea

4
推荐指数
1
解决办法
4021
查看次数

空间复杂度字符串生成器

在下面的例子中,如果我输入 a String s,空间复杂度是 O(n) 还是 O(1)?如果我只添加元音,它仍然是 O(n) 吗?

String s = "dfgdfgdfga";
StringBuilder sb = new StringBuilder();
for (int i = 0;i <s.length(); i++) {
    sb.append(s.charAt(i));
}
return sb.toString();
Run Code Online (Sandbox Code Playgroud)

java string complexity-theory stringbuilder

4
推荐指数
1
解决办法
2745
查看次数

来自 2 个(或更多)字符串的压缩字符串 - "AB" + "YZ" = "AYBZ"

所以我试图从压缩在一起的 2 个输入句子返回另一个字符串。如果 2 个句子的长度相同,它将产生实际输出。如果两个输入句子的长度不相同,那么它只会返回一个空字符串。到目前为止,这是我的代码,但我不知道如何正确压缩单词,有人可以帮助我。顺便说一句,如果您能通过递归执行此操作来帮助我,那就太好了,因为我正在尝试这样做。

前任:

Zippppp("ABC", "123") will return "A1B2C3"
Zippppp("AD", "CCC") will return “”
Run Code Online (Sandbox Code Playgroud)
public class Zippppp
{
    public Zippppp(String a, String s)
    {
       int l1 = a.length();
       int l2 = s.length();
       if(l1 == l2)
          for(int i = 0; i > l1; i++)          
             System.out.print( a.substring(0, 1) + s.substring(0, 1));
     }
      
     public static void main(String args[ ])
     {
        Zippppp sv = new Zippppp("ABC", "123");
        System.out.print(sv);
     }
}
Run Code Online (Sandbox Code Playgroud)

java arrays stringbuilder loops collectors

4
推荐指数
1
解决办法
251
查看次数

复制 StringBuilder 的最佳方法是什么?

StringBuilder从另一个实例化一个新实例的最佳方法(性能方面)是什么?(复制Ctor)。

我不想通过不可变的字符串传递,因为下划线数据非常大。

所以下面的内容是有效的,但不是想要的。

StringBuilder newSB = new StringBuilder(oldSB.ToString());
Run Code Online (Sandbox Code Playgroud)

我想要类似的东西

StringBuilder newSB = new StringBuilder(oldSB);
Run Code Online (Sandbox Code Playgroud)

但这不受支持。

c# stringbuilder

4
推荐指数
1
解决办法
2322
查看次数

StringBuilder.Append问题

我想知道之间的区别(如果有的话):

StringBuilder sb = new StringBuilder(); 
sb.Append("xxx");
sb.Append("yyy");
sb.Append("zzz");
Run Code Online (Sandbox Code Playgroud)

而且:

StringBuilder sb = new StringBuilder(); 
sb.Append("xxx")
  .Append("yyy")
  .Append("zzz");
Run Code Online (Sandbox Code Playgroud)

c# stringbuilder

3
推荐指数
1
解决办法
366
查看次数

StringBuilder,在值之间添加Tab

我有一个小问题:

我有一个字段列表,有3个值.我想用这三个值构建我的String,由"TAB"分隔.

码:

StringBuilder stringBuilder = new StringBuilder();
foreach (string field in fields)
{
    stringBuilder.Append(field).Append("\t");
}
stringBuilder.AppendLine();
return stringBuilder.ToString();
Run Code Online (Sandbox Code Playgroud)

Tab只在第3和第2之间(第1和第2之间是空格?!)

所以我尝试了这个:

StringBuilder stringBuilder = new StringBuilder();
foreach (string field in fields)
{
    stringBuilder.Append(field + "\t").Append("\t");
}
stringBuilder.AppendLine();
return stringBuilder.ToString();
Run Code Online (Sandbox Code Playgroud)

然后我在第3和第2之间有2个标签,第1和第2之间有一个标签,第1和第2之间也有空格.

(空间永远在那里,如何避免?)

那我该怎么办?需要(没有空格..)这些值之间的选项卡..

c# string stringbuilder tabs append

3
推荐指数
1
解决办法
5万
查看次数