【问题标题】:java stringbuffer declarationjava字符串缓冲区声明
【发布时间】:2010-02-19 05:37:39
【问题描述】:

当我不包含注释行时,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

【问题讨论】:

    标签: java string memory stringbuilder


    【解决方案1】:

    您需要打印.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) 的效果是一样的。每个字符串生成器都有容量。只要字符串构建器中包含的字符序列的长度不超过容量,就不需要分配新的内部缓冲区。如果内部缓冲区溢出,它会自动变大。 -

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        StringBuilder prevLineBuffer;
        

        声明对 StringBuilder 的 引用。在调用构造函数之前,StringBuilder 本身并不存在。因此你得到一个 NullPointerException - prevLineBuffer 引用为空。

        您的 prevLineBuffer 为空的原因仅仅是您从不向其附加任何内容 - 另请参阅其他回复。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-10
          • 1970-01-01
          • 2012-03-03
          • 1970-01-01
          • 2010-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多