(注意:虽然我想了解 .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) 我正在创建一个 StringBuilder 来收集我定期刷新到服务器的字符串。如果刷新失败,我想保留这些字符串以便下次再试,但同时我可能会收到额外的字符串,这些字符串必须添加到 StringBuilder。
我想知道最有效的方法是什么,因为这是在 Android 应用程序中完成的,其中电池使用情况和 CPU 使用情况是一个大问题。调用 StringBuilder 的 toString() 函数是否会存储它在内部返回的结果字符串,以便后续调用不必执行复制所有原始字符串的工作?或者,如果调用失败,我是否应该创建一个新的 StringBuilder,并使用 toString() 的返回值进行初始化?
我的问题是我是否使用 StringBuffer(或 StringBuilder),以及我是否多次在实例上调用 toString 方法。StringBuffer 每次都会返回新的 String 实例还是从 String 池中返回 String?(假设我在两次调用之间没有对 StringBuffer 进行任何更改)
在 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 进行优化而只需使用“+”运算符而不是?
我下面的方法需要返回一个由字符串连接而成的字符串。
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 中有意义吗?
在下面的例子中,如果我输入 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) 所以我试图从压缩在一起的 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) 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)
但这不受支持。
我想知道之间的区别(如果有的话):
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) 我有一个小问题:
我有一个字段列表,有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之间也有空格.
(空间永远在那里,如何避免?)
那我该怎么办?只需要(没有空格..)这些值之间的选项卡..
stringbuilder ×10
java ×5
string ×5
c# ×4
.net-3.5 ×1
android ×1
append ×1
arrays ×1
buffer ×1
collectors ×1
loops ×1
optimization ×1
stringbuffer ×1
tabs ×1