标签: stringbuilder

StringBuilder的RAM消耗是什么样的?

我们有一些操作,我们正在进行大量的大型字符串连接,并且最近遇到了内存不足异常.不幸的是,调试代码不是一种选择,因为这是在客户站点发生的.

因此,在研究代码的大修之前,我想问一下:对于大型字符串,StringBuilder的RAM消耗特性是什么?

特别是它们与标准字符串类型相比.字符串的大小超过10 MB,我们似乎遇到了大约20 MB的问题.

注意:这不是速度而是RAM.

.net ram stringbuilder

6
推荐指数
2
解决办法
2616
查看次数

LINQ从String []附加到StringBuilder

我有一个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)

c# linq lambda stringbuilder

6
推荐指数
2
解决办法
1万
查看次数

使用字符串初始化的StringBuilder是否包含该字符串的确切(仅)空间?

我想知道这段代码是否......

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沿途情况; 因此,这是为了提高效率.我觉得应该指定这个构造函数的行为,以便开发人员可以做出明智的决定如何使用它而不管平台.

我的意思是,它是由微软以某种方式实现的; 他们可以很容易地将其放入文档中(迫使其他实现也遵循).只是个人困惑的来源......

.net stringbuilder buffer constructor

6
推荐指数
1
解决办法
453
查看次数

具有显着变化长度的输入的最佳StringBuffer初始容量是多少?

大家下午好,我正在使用java.lang.StringBuilder存储一些字符.我不知道我要提前存储多少个角色,除了:

  1. 60%的时间,它只有(确切地说)7个字符
  2. 39%的时间,(大约)3500个字符
  3. 1%的时间,大约是20k个字符

我们如何计算应该使用的最佳初始缓冲区长度?

目前我正在使用,new java.lang.StringBuilder(4000)但这只是因为我以前懒得思考.

java language-agnostic math stringbuilder buffer

6
推荐指数
1
解决办法
3295
查看次数

创建了多少个对象

我正在讨论在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个对象.

java string stringbuilder bytecode object

6
推荐指数
3
解决办法
1910
查看次数

将StringBuilder写入Writer,而不是toString()

在Servlet中,我在StringBuilder中构建了大量的HTML内容,最后需要将其写入响应的PrintWriter.为了使用PrintWriter,它必须首先调用StringBuilder的toString()方法以将内容作为String获取.但这不必要地重复了内容.是否有某种方法直接从StringBuilder写入,因为它已经持有内容?

PrintWriter可以接受CharSequence,但文档声明它调用CharSequence的toString(),所以它并没有真正帮助.

我能看到的唯一明确的方法是使用StringBuilder的charAt(i)方法一次获取和写入一个字符,但这会是一个改进吗?

java stringbuilder servlets printwriter

6
推荐指数
1
解决办法
3442
查看次数

为什么以下条件运算符在包含Nullable类型的StringBuilder中奇怪地工作?在C#?

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)".

有没有人知道背后的原因,如果可能的话可以提供参考?

.net c# stringbuilder nullable conditional-operator

6
推荐指数
1
解决办法
340
查看次数

为什么StringBuilder不打印?

为什么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".任何人都可以向我解释这里发生了什么吗?

java stringbuilder

6
推荐指数
1
解决办法
445
查看次数

澄清StringBuilder参考和方法执行顺序

这段代码

    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!现在)并且附加相同的字符串.所以

  1. 内部表达式被执行
  2. 原始对象被修改
  3. 外部表达式在修改后的对象上执行

但现在,为什么这个代码会抛出一个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)

java stringbuilder reference

6
推荐指数
1
解决办法
132
查看次数

为什么StringBuffer有一个toStringCache而StringBuilder没有?

在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,差异是否相关?

java stringbuilder stringbuffer java-8

6
推荐指数
1
解决办法
460
查看次数