【发布时间】:2008-09-29 10:28:40
【问题描述】:
【问题讨论】:
标签: java data-structures
【问题讨论】:
标签: java data-structures
在集合上调用 toString 应该返回一个包含所有元素字符串表示形式的字符串。
这不适用于内置数组,因为它们没有 toString 覆盖,只会给你一个内存地址。
【讨论】:
ClassName@<address_value>。在自定义类上使用什么?
toString() 方法以使其返回您想要的。
java 中的 toString() 和 PHP 中的 print_r() 之间确实存在差异。 请注意,php 中还有 __toString() ,它等同于 java 中的 toString(),所以这不是真正的答案。
print_r 用于当我们有一个对象结构并且我们希望快速查看对象及其值的完整图时。
在java中为每个对象实现toString没有与print_r相比的能力。
改为使用 gson。它和 print_r 做同样的工作
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println(gson.toJson(someObject));
通过这种方式,您无需为需要测试的每个对象都实现 toString。
这里是文档: http://sites.google.com/site/gson/gson-user-guide
演示类(在 java 中):
公开课 A {
int firstParameter = 0; B secondObject = new B();}
公共类 B {
String myName = "this is my name";}
这是带有 print_r 的 php 中的输出:
对象
(
[firstParameter:private] => 0
[secondObject:private] => B 对象
(
[myName:private] => 这是我的名字
))
下面是带有 gson 的 java 输出:
{
“第一个参数”:0,
“第二个对象”:{
"myName": "这是我的名字"
}
}
【讨论】:
根据您想要做什么,解决方案可能相当简单。以下不会产生 print_r 提供的格式化输出,但它允许您输出列表、数组和映射的结构:
// Output a list
final List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
System.out.println(list);
// Output an array
final String[] array = {"four", "three", "two", "one"};
System.out.println(Arrays.asList(array));
// Output a map
final Map<String, String> map = new HashMap<String, String>();
map.put("one", "value");
map.put("two", "value");
map.put("three", "value");
System.out.println(map.entrySet());
对于其他类型的对象,您可以使用reflection 来为此创建utility。
【讨论】:
你可以试试老旧的 Apache Commons Lang 的 ToStringBuilder。
【讨论】:
我对类似 Java print_r 的功能的看法是我编写的 RecursiveDump 类。
它并不完美,但对我来说效果很好。用法是:
String output = RecursiveDump.dump(...);
可以使用泛型来改进它,我在很多年前就写过,在我知道它们之前。此外,当它尝试处理某些 Collection 类型时,对于 Objects,它只会调用 toString() 方法。
我想使用反射来提取没有正确toString() 的类的字段名称,但是由于Spring Roo @RooToString 可以为您编写toString() 方法...
当然,替代方法是使用调试器的检查器工具,但有时使用打印会更快。
【讨论】:
其他人提到了toString() 方法。这仅在对象实现toString() 时才有用。如果没有正确实施,你最终会得到这样的结果:java.lang.Object@1b9240e。
即使有点繁琐,在您自己的类中实现toString() 仍然很容易,但第三方类并不总是会实现它。你最好使用调试器。像print_r 这样的东西甚至存在于PHP 中的唯一原因是缺少真正的调试器。我想你会发现能够设置断点而不是使用一堆诊断打印语句将导致更快的工作流程和更简洁的代码。
【讨论】:
我不知道 java 中的 print_r 等价物。
但是……
每个对象都有一个 toString() 方法的默认实现,如果你为它们调用 toString(),list 和 map 实现会打印它们的内容。
如果您需要打印出任何调试信息,toString() 可能就是您要查找的地方。
【讨论】:
在 Java 中没有 print_r 的等价物。
但对于地图或列表,您可以像这样使用 foreach 循环:
List <String> list = …; // fills your list
// print each list element
for (String s : list) {
System.out.println(s);
}
【讨论】:
对于数组,最简单的方法是 Arrays.asList(array).toString() 。 我通常在调试输出中喜欢的对象上实现 toString()。对于生成的对象(JAXB 等),可能需要创建一个实用程序类来打印它。
【讨论】: