背景
所有 Java 对象都有一个toString()
方法,当您尝试打印对象时调用该方法。
System.out.println(myObject); // invokes myObject.toString()
该方法定义在Object http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html类(所有 Java 对象的超类)。这Object.toString() http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#toString--方法返回一个看起来相当难看的字符串,由类名、@
符号和hashcode https://stackoverflow.com/questions/3563847/what-is-the-use-of-hashcode-in-java对象的十六进制。其代码如下所示:
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
结果如com.foo.MyType@2f92e0f4
因此可以解释为:
-
com.foo.MyType
- 班级名称,即班级是MyType
包装内com.foo
.
-
@
- 将字符串连接在一起
-
2f92e0f4
对象的哈希码。
数组类的名称看起来有点不同,Javadocs 中对此进行了很好的解释Class.getName() http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getName--。例如,[Ljava.lang.String
means:
-
[
- 一维数组(与[[
or [[[
etc.)
-
L
- 数组包含类或接口
-
java.lang.String
- 数组中对象的类型
自定义输出
当您致电时打印不同的内容System.out.println(myObject)
, 你必须override https://docs.oracle.com/javase/tutorial/java/IandI/override.html the toString()
你自己的类中的方法。这是一个简单的例子:
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
现在如果我们打印一个Person
,我们看到的是他们的名字而不是com.foo.Person@12345678
.
请记住toString()
只是one将对象转换为字符串的方法。通常,此输出应以清晰简洁的方式完整描述您的对象。一个更好的toString()
为了我们的Person
类可能是:
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
它将打印,例如,Person[name=Henry]
。这对于调试/测试来说是非常有用的数据。
如果您只想专注于对象的一个方面或包含大量爵士乐格式,那么您可能最好定义一个单独的方法,例如String toElegantReport() {...}
.
自动生成输出
Many IDEs http://en.wikipedia.org/wiki/Integrated_development_environment提供对自动生成的支持toString()
方法,基于类中的字段。请参阅文档Eclipse http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fref-dialog-tostring.htm and IntelliJ https://plugins.jetbrains.com/plugin/182?pr=idea, 例如。
一些流行的 Java 库也提供了此功能。一些例子包括:
-
ToStringBuilder http://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/builder/ToStringBuilder.html from 阿帕奇通用语言 http://commons.apache.org/proper/commons-lang/
-
MoreObjects.ToStringHelper https://google.github.io/guava/releases/19.0/api/docs/com/google/common/base/MoreObjects.ToStringHelper.html from 谷歌番石榴 https://github.com/google/guava
-
@ToString http://projectlombok.org/features/ToString.html注释来自龙目岛计划 http://projectlombok.org/
打印对象组
所以你已经创建了一个不错的toString()
为你的班级。如果将该类放入数组或集合中会发生什么?
Arrays
如果你有一个对象数组,你可以调用Arrays.toString() http://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#toString-java.lang.Object:A-生成数组内容的简单表示。例如,考虑这个数组Person
对象:
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
注意:这是对static方法称为toString()
在 Arrays 类中,这与我们上面讨论的不同。
如果你有一个多维数组, 您可以使用Arrays.deepToString() http://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#deepToString-java.lang.Object:A-以获得相同类型的输出。
收藏
大多数集合都会根据调用产生漂亮的输出.toString()
在每个元素上。
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
所以你只需要确保你的列表元素定义一个好的toString()
如上所述。