6号线和8号线有什么区别?
它们都打印相同的字符串。为什么我们需要将 toString 与 StringBuilder 一起使用?
StringBuilder s = new StringBuilder("hello"); // Line 1
System.out.println(s); // Line 2
s.append("hi"); // Line 3
System.out.println(s); // Line 4
s.append("okk"); // Line 5
System.out.println(s); // Line 6
s.toString(); // Line 7
System.out.println(s); // Line 8
6号线和8号线没有什么不同。
PrintStream.println(Object) 调用 string.valueOf(Object) ,后者调用对象的
toString()
方法,然后打印出来。
System.out.println(s)
和 System.out.println(s.toString())
具有相同的输出(除非 s
是 null
,在这种情况下后者会抛出异常)。
直接调用
s.toString()
的原因是从 StringBuilder 获取当前“构建”值作为 string
,以便您可以将其传递给需要 string
的其他代码。如果您要调用的代码采用 StringBuilder
,您可以只传递 s
,但是被调用的代码可以修改您的值(它们不能使用 string
,因为它是不可变的数据类型)。
System.out.println 可以打印出字符数组(第6行) s.toString() 用于实际将字符串构建器内容放入字符串中。在您的代码中,您没有将其设置为字符串变量,因此不会发生任何事情...因此在第 8 行,从字符串生成器的内容再次打印字符数组。
如果您添加 字符串 str = s.toString(); System.out.println(str);
然后字符串将打印由 stringbuilder 生成的字符串变量。
StringBuilder 需要 toString() 将可变的字符序列转换为 String。
因此从技术上讲,要从返回 String 的方法返回 StringBuilder 对象,您必须使用 toString() 将 StringBuilder 转换为 String。
您还可以在不使用 toString() 方法的情况下 sysout StringBuilder 对象来直接获取值