【问题标题】: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 为空的原因仅仅是您从不向其附加任何内容 - 另请参阅其他回复。