MSDN文档的常规"线程安全"部分,用于StringBuilder说明:
...任何实例成员都不保证是线程安全的......
但是这个陈述感觉它已被复制并粘贴到框架中的几乎每个类:
http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx
但是,Gavin Pugh的这些博客文章提到了以下的线程安全行为StringBuilder:
http://www.gavpugh.com/2010/03/23/xnac-stringbuilder-to-string-with-no-garbage/
http://www.gavpugh.com/2010/04/01/xnac-avoiding-garbage-when-working-with-stringbuilder/
此外,Reflector揭示的StringBuilder的源代码以及SSCLI源代码中的相应注释也提出了许多实现注意事项以确保线程安全性:
有没有人更深入地了解一个StringBuilder实例是否可以安全地在多个并发线程之间共享?
我在将字符串中的第一个字母转换为Capital时遇到问题:
rackingSystem.toLowerCase(); // has capitals in every word, so first convert all to lower case
StringBuilder rackingSystemSb = new StringBuilder();
rackingSystemSb.append(rackingSystem);
rackingSystemSb.setCharAt(0, Character.toUpperCase(rackingSystemSb.charAt(0)));
rackingSystem = rackingSystemSb.toString();
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用..
有什么建议?
我有一个Strings 列表,我想用它们之间的空格连接起来.所以我正在使用StringBuilder.现在,如果有任何Strings null,它们将被StringBuilder字面上存储为"null".这是一个小程序来说明问题:
public static void main(String ss[]) {
StringBuilder sb = new StringBuilder();
String s;
s = null;
System.out.println(sb.append("Value: ").append(s));
}
Run Code Online (Sandbox Code Playgroud)
我希望输出为"Value:",但它出现为"Value:null"
有没有解决这个问题的方法?
如果必须使用String.Replace()替换测试50次,则基本上必须创建一个新字符串50次.StringBuilder.Replace()是否更有效地执行此操作?例如,如果我要替换大量文本,我是否应该使用StringBuilder,即使我不会向其添加任何数据?
我正在使用.NET,但我认为这与Java和其他语言可能相同.
我正在尝试使用DialogResult和保存文件StringBuilder.在制作文本后,我调用以下代码来保存文件:
if (dr == DialogResult.OK)
{
StreamWriter sw = new StreamWriter(saveFileDialog1.FileName);
sw.Write(sb.ToString());
sw.Close();
}
Run Code Online (Sandbox Code Playgroud)
我试图将第二个参数添加到StreamWriteras,Encoding.UTF8但由于第一个参数是a string而不是a Stream,因此它不会编译它.
如何将该字符串转换为流,以便能够将第二个参数作为编码传递?
这样做的原因,是在我的文字是什么地方我有µ,但是当文件被保存它显示像μ这样µ越来越screwd!
谢谢
我真的很感谢有人帮我解决以下问题:
我现在得到以下异常:
指数超出范围.必须是非负数且小于集合的大小.参数名称:chunkLength
在stringBuilder.ToString().
奇怪的是,如果我放入stringBuilder.ToString()手表,它的效果非常好.
StringBuiler是一个可变对象,F#鼓励尽可能多地使用不变性.所以应该使用转换而不是变异.在F#中构建字符串时,这是否适用于StringBuilder?有一个F#immutable替代它吗?如果是这样,这种替代方案是否有效?
使用字符串生成器而不是纯字符串连接有什么好处和权衡?
new StringBuilder(32).append(str1)
.append(" test: ")
.append(val)
.append(" is changed")
.toString();
Run Code Online (Sandbox Code Playgroud)
vs说
str1 + " test: " + val + " is changed".
Run Code Online (Sandbox Code Playgroud)
str1是一个随机的10个字符串.
str2是一个随机的8个字符串.
StringBuilder的Append(字符串s)函数(和类似函数)的完整语法是
StringBuilder myStringBuilder.Append(string myString)
Run Code Online (Sandbox Code Playgroud)
既然myStringBuilder.Append(string myString)已经添加了字符串myStringBuilder,我想知道返回值是什么?我从未见过任何使用返回值的示例代码.
根据msdn,它不会返回一个新StringBuilder实例,而是返回对当前构建器本身的引用(即可能myStringBuilder).我只是想不到一个场景,当使用返回值有意义时,他们为什么不做返回类型void?
我知道Javac编译器能够+使用StringBuilder/ 来转换字符串连接StringBuffer,并且我很想知道从哪个版本引入了这个更改?
我正在使用此示例代码:
public class Main {
public static void main(String[] args) {
String a = args[0];
String s = "a";
s = s + a;
s = s + "b";
s = s + "c";
s = s + "d";
s = s + "e";
System.out.println(s);
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经试过javac 1.8.0_121,javac 1.6.0_20,javac 1.5.0_22和java 1.4.2_19.
这里是字节码我看到使用的样本javap -c来自1.4.2_19:
6: astore_2
7: new …Run Code Online (Sandbox Code Playgroud) stringbuilder ×10
java ×4
c# ×3
.net ×2
append ×1
capitalize ×1
exception ×1
f# ×1
immutability ×1
javac ×1
jdk1.4 ×1
null ×1
streamwriter ×1
string ×1
stringbuffer ×1
tostring ×1