我对StringBuilder有点困惑。看来当我打印一个StringBuilder时,不需要添加.toString(),因为它会自动给我一个字符串表示。但是,当我返回一个StringBuilder对象时,我必须添加.toString()。真的吗?为什么?
另外,我对以下代码感到有点困惑:
package com.tutorialspoint;
import java.lang.*;
public class StringBuilderDemo {
public static void main(String[] args) {
StringBuilder str = new StringBuilder("India ");
System.out.println("string = " + str);
// append character to the StringBuilder
str.append('!');
// convert to string object and print it
System.out.println("After append = " + str.toString());
str = new StringBuilder("Hi ");
System.out.println("string = " + str);
// append integer to the StringBuilder
str.append(123);
// convert to string object and print it
System.out.println("After append = " + str.toString());
}
}
对于不同的println,有时这个代码使用toString,有时则不使用。为什么?我尝试删除toString,结果是一样的。是否仍然需要在println中使用toString?
非常感谢帮助新手!
答案 0 :(得分:8)
将对象打印到打印流时,将打印该对象的String
表示,因此会调用toString
。
有些类会覆盖Object#toString
,其中StringBuilder
会覆盖toString
。
因此,不需要为StringBuilder
显式调用toString
。
另一方面,其他对象不会覆盖Arrays.toString
。例如,数组。
当您打印数组时,除非使用@
之类的实用程序,否则您将获得数组的类类型vtkMedicalImageReader2* medimg = vtkMedicalImageReader2::New();
medimg->SetFileName(argv[1]);
medimg->Update();
printf("Patient gender: %s\n",medimg->GetMedicalImageProperties()->GetPatientSex());
printf("Age %s\n",medimg->GetMedicalImageProperties()->GetPatientAge());
printf("Modality %s\n",medimg->GetMedicalImageProperties()->GetModality());
其哈希代码,而不是人类可读的内容表示形式。
答案 1 :(得分:6)
请注意,println()会打印字符串构建器,如:
System.out.println(sb);
因为sb.toString()是隐式调用的,与println()调用中的任何其他对象一样。
答案 2 :(得分:3)
如果您尝试将对象附加到这样的字符串:"string = " + str
,则会隐式调用toString()方法。
所以不,如果你指定它没关系。
toString()方法本身(即使你没有将它附加到字符串)调用toString()方法。
因此,System.out.println(str)
和System.out.println(str.toString())
会得到相同的结果。
答案 3 :(得分:3)
由于以下两个原因之一,当您打印时,您不需要使用toString
。首先,如果您只是将其打印出来,那是因为有一个方法println(Object)
on the PrintStream
类,它会为您调用toString
。在这种情况下会发生这种情况:
System.out.println(myStringBuilder); //Calling println(object)
第二个可能的原因是你将它与String
连接起来。在这种情况下,编译器会为您调用toString
。在这两种情况下,toString
仍然被调用,它只是在幕后完成。那就是这种情况:
System.out.println("String " + myStringBuilder); //println(String), plus compiler magic
从方法返回时,返回类型定义为String
。由于StringBuilder
不是String
,并且不存在任何类型的编译器魔法来隐式将其转换为一个,您需要自己进行转换。
String methodReturningString(){
StringBuilder sb = new StringBuilder();
//return sb; <- doesn't work, since a StringBuilder is not a String
return sb.toString(); //Explicitly making the conversion yourself.
}
答案 4 :(得分:1)
您应该了解Java的第一件事是我们使用对象并且所有对象都从类Object继承方法:http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html
此类具有toString()方法,并且由于每个对象都继承此方法,因此始终可以在每个对象上调用它。如果不覆盖它,通常会返回对象的物理地址。
如同在其他答案中所述,每当在println中预期一个字符串并且你传递一个对象时它会自动调用需要一个Object的方法(注意大写,我们在这里讨论类Object),然后它会对作为参数传递的对象使用toString方法。你得到你想要的字符串的原因是因为StringBuilder为你重写了toString()方法。
当你在自己的代码中想要在StringBuilder中传递字符串时,你有两个选择。您可以传递StringBuilder.toString()或将返回类型更改为Object或StringBuilder,并在实际需要时调用toString()。
希望这可以澄清为什么你只能传递对象而不是字符串。