java stringbuffer声明

时间:2010-02-19 05:37:39

标签: java string memory stringbuilder

当我不包含注释行时,prevLineBuffer包含“null”。当我包括注释行时,它仍然有效,但打印一个空字符串。 Java是否为声明的字符串静态分配空间,然后为注释行中的其他字符串动态分配空间?两者似乎都有效......

public class Indexer {
    String input;
    StringBuilder prevLineBuffer;

    Indexer(String inputFileName) throws RuntimeException{
        input = inputFileName;
        //prevLineBuffer = new StringBuilder();
        System.out.print(prevLineBuffer);

    }//constructor
}//class

3 个答案:

答案 0 :(得分:2)

您需要打印.toString().append()某些内容的结果,以便为其打印一些内容。例如:

    prevLineBuffer = new StringBuilder();
    prevLineBuffer.append(inputFileName);
    System.out.print(prevLineBuffer.toString());

回答你问题的后半部分......

来自String docs

  

字符串池(最初为空)由String类私有维护。 [...]当调用intern方法时,如果池已经包含一个等于此String对象的字符串(由equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。

来自StringBuilder docs

  

通常,如果sb引用StringBuilder的实例,则sb.append(x)与sb.insert(sb.length(),x)具有相同的效果。每个字符串构建器都有容量。只要字符串生成器中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区。如果内部缓冲区溢出,它会自动变大。 -

答案 1 :(得分:1)

简而言之,将任何内容的空引用打印到PrintStream(这是System.out的内容)将追加“null”。这是因为print()和println()方法显式测试null,使用类似:txt=(obj==null ? "null" : obj.toString());

当您创建StringBuilder而不是将其保留为null时,打印的是StringBuilder的toString(),如果您没有添加任何内容,则为空字符串,或者......没有。

答案 2 :(得分:0)

Java不会静态地为对象分配空间。这条线

StringBuilder prevLineBuffer;

向StringBuilder声明引用。在调用构造函数之前,StringBuilder本身不存在。因此,您将获得NullPointerException - prevLineBuffer引用为null。

你的prevLineBuffer为空的原因只是你从不向它添加任何内容 - 另见其他回复。