返回或打印StringBuilder? Java的

时间:2015-10-27 15:20:30

标签: java

我对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?

非常感谢帮助新手!

5 个答案:

答案 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)

From the documentation:

请注意,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()。

希望这可以澄清为什么你只能传递对象而不是字符串。