我们有一些操作,我们正在进行大量的大型字符串连接,并且最近遇到了内存不足异常.不幸的是,调试代码不是一种选择,因为这是在客户站点发生的.
因此,在研究代码的大修之前,我想问一下:对于大型字符串,StringBuilder的RAM消耗特性是什么?
特别是它们与标准字符串类型相比.字符串的大小超过10 MB,我们似乎遇到了大约20 MB的问题.
注意:这不是速度而是RAM.
我有一个String数组,我想通过LINQ添加到字符串生成器.
我基本上想说的是"对于这个数组中的每个项目,在这个StringBuilder中附加一行".
我可以使用foreach循环很容易地做到这一点但是下面的代码似乎没有做任何事情.我错过了什么?
stringArray.Select(x => stringBuilder.AppendLine(x));
Run Code Online (Sandbox Code Playgroud)
这工作的地方:
foreach(String item in stringArray)
{
stringBuilder.AppendLine(item);
}
Run Code Online (Sandbox Code Playgroud) 我想知道这段代码是否......
StringBuilder sb = new StringBuilder("Please read the following messages.");
Run Code Online (Sandbox Code Playgroud)
...使用sb与传递给构造函数的字符串完全一样大的缓冲区进行初始化.一方面,这似乎是最合乎逻辑的事情.另一方面,似乎有点打败了StringBuilder类最常见用途之一的目的,即提供可变性以使重复追加更有效.(第一次打电话Append,如果我的问题的答案是"是",则需要sb调整自己的大小.)
然后再次,我想人们可以将其视为与构造函数类似List<T>,并将其IEnumerable<T>作为参数.也许在这种情况下的假设是你不打算附加很多,而是操纵已经存在的东西.
我在这方面做的唯一真正的研究是检查StringBuilder上的MSDN文档,它没有提供答案(它表示构造函数使用指定的字符串初始化实例),但没有指出字符串是如何用过的).
编辑:所以这是"特定于实现"......这对其他人来说似乎并不奇怪吗?我的意思是,宗旨的的StringBuilder类是提供一种替代执行了很多在操作中string,产生一吨不变的string沿途情况; 因此,这是为了提高效率.我觉得应该指定这个构造函数的行为,以便开发人员可以做出明智的决定如何使用它而不管平台.
我的意思是,它是由微软以某种方式实现的; 他们可以很容易地将其放入文档中(迫使其他实现也遵循).只是个人困惑的来源......
大家下午好,我正在使用java.lang.StringBuilder存储一些字符.我不知道我要提前存储多少个角色,除了:
我们如何计算应该使用的最佳初始缓冲区长度?
目前我正在使用,new java.lang.StringBuilder(4000)但这只是因为我以前懒得思考.
我正在讨论在Java中使用Strings和StringBuffers的问题.在这两个例子的每一个中创建了多少个对象?
例1:
String s = "a";
s = s + "b";
s = s + "c";
Run Code Online (Sandbox Code Playgroud)
例2:
StringBuilder sb = new StringBuilder("a");
sb.append("b");
sb.append("c");
Run Code Online (Sandbox Code Playgroud)
在我看来,Ex 1将创建5,而Ex 2将创建4个对象.
在Servlet中,我在StringBuilder中构建了大量的HTML内容,最后需要将其写入响应的PrintWriter.为了使用PrintWriter,它必须首先调用StringBuilder的toString()方法以将内容作为String获取.但这不必要地重复了内容.是否有某种方法直接从StringBuilder写入,因为它已经持有内容?
PrintWriter可以接受CharSequence,但文档声明它调用CharSequence的toString(),所以它并没有真正帮助.
我能看到的唯一明确的方法是使用StringBuilder的charAt(i)方法一次获取和写入一个字符,但这会是一个改进吗?
StringBuilder htmlResp=new StringBuilder();
int? cuID= 1;
string cuName="Tom";
string cuEmpID="ZXCV";
htmlResp .Append( "<option value=\"" + cuID.Value + "\">" + cuName+" ("+cuEmpID==""? "-":cuEmpID+")"+ "</option>");
html.Resp.ToString();
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么上面的代码(从实际代码中修改)总是给我奇怪的结果:"ZXCV"而不是"Tom(ZXCV)".
有没有人知道背后的原因,如果可能的话可以提供参考?
为什么StringBuilder不会在小代码中打印它应该打印的内容
public final class Test1 {
public void test() {
System.out.println(setFin().toString());
}
protected StringBuilder setFin() {
StringBuilder builder = new StringBuilder();
try {
builder.append("John");
return builder.append("Ibrahim");
} finally {
System.out.println("In finaly"); // builder.append("-DarElBeida");
builder = null;
}
}
public static void main(String args[]){
new Test1().test();
}
}
Run Code Online (Sandbox Code Playgroud)
在执行的最后一条语句setFin()(中finally块)我已经分配null给builder,但我的代码打印"In finally",然后"JohnIbrahim".任何人都可以向我解释这里发生了什么吗?
这段代码
StringBuilder b1=new StringBuilder("hello");
b1.append(b1.append("!"));
System.out.println("b1 = "+b1);
Run Code Online (Sandbox Code Playgroud)
将打印
b1 = hello!hello!
Run Code Online (Sandbox Code Playgroud)
因为内部append是先执行并修改对象b1; 然后b1评估外部(它等于hello!现在)并且附加相同的字符串.所以
但现在,为什么这个代码会抛出一个NullPointerException?
StringBuilder s1=null;
StringBuilder s2=new StringBuilder("world");
try{s1.append(s1=s2.append("!"));}
catch(Exception e){System.out.println(e);}
System.out.println("s1 = "+s1+"\ns2 = "+s2+"\n");
Run Code Online (Sandbox Code Playgroud)
和打印
java.lang.NullPointerException
s1 = world!
s2 = world!
Run Code Online (Sandbox Code Playgroud)
我期待引用s1指向外部执行s2 之前引用的对象append.
在某种程度上,分配b1.append("!");会影响"外部" b1,但s1=s2.append("!")不会.我知道这是因为在第一种情况下我正在修改对象,而在第二种情况下我正在修改引用,但是......评估和执行值/引用/方法的顺序是什么?
数组也是如此:
int[] y = { 0, 0, 0 };
try {y[y[0] = 2] = 4;} …Run Code Online (Sandbox Code Playgroud) 在JDK 8中,StringBuffer类有一个toStringCache,而StringBuilder没有.
/**
* A cache of the last value returned by toString. Cleared
* whenever the StringBuffer is modified.
*/
private transient char[] toStringCache;
Run Code Online (Sandbox Code Playgroud)
但为什么?
我能想到的一个可能原因是StringBuffer已经同步,因此可以更容易地实现缓存.
或者也许历史上StringBuffer是以这种方式实现的,所以旧代码在很大程度上依赖于这个功能?
鉴于具有逃逸分析和偏向锁定的现代JVM,差异是否相关?
stringbuilder ×10
java ×6
.net ×3
buffer ×2
c# ×2
bytecode ×1
constructor ×1
java-8 ×1
lambda ×1
linq ×1
math ×1
nullable ×1
object ×1
printwriter ×1
ram ×1
reference ×1
servlets ×1
string ×1
stringbuffer ×1