java.util.Objects
类包含deepEquals(Object a, Object b)
方法,该方法可用于比较任何类型的对象(包括数组和空引用),但不包含类似的deepToString(Object o)
。这真令人失望。 (顺便说一句,此类的私有构造函数包含消息“没有您的java.util.Objects实例!”在某种程度上解释了为何此类如此含义)。在这种情况下,我尝试自己实现该方法:
public static String deepToString(Object o) {
if (o == null || !o.getClass().isArray())
return Objects.toString(o);
else
return Arrays.deepToString((Object[])o);
}
问题是它不适用于基本类型的一维数组。我是否必须遍历带有嵌套else if
的所有原始数组类型并为其调用相应的Arrays.toString(...)
方法,还是有一个更简单的替代方法?
[我来到这个解决方案:将原始数组包装到Object[]
中,并从公众Arrays.deepToString(Object[] a)
返回的结果中删除外括号:
public static String deepToString(Object o) {
if (o == null || !o.getClass().isArray())
return Objects.toString(o);
else if (o instanceof Object[])
return Arrays.deepToString((Object[])o);
else {
String s = Arrays.deepToString(new Object[] { o });
return s.substring(1, s.length() - 1);
}
}
效率不高,因为它可以创建两个大字符串,而不是一个字符串。但是有了这个技巧,我可以使用隐藏的
Arrays.deepToString(Object[] a, StringBuilder buf, Set<Object[]> dejaVu)
包含原始数组解析逻辑的方法。