1. 概述
在本教程中,我们将了解[Ljava.lang.Object的含义以及如何访问对象的正确值。
2. Java Object类
在Java中,如果我们想直接从对象打印一个值,我们可以尝试的第一件事就是调用它的toString方法:
Object[] arrayOfObjects = { "John", 2, true };
assertTrue(arrayOfObjects.toString().startsWith("[Ljava.lang.Object;"));
如果我们运行测试,它会成功,但通常这不是一个非常有用的结果。
我们要做的是打印数组中的值。相反,我们得到的是[Ljava.lang.Object,类的名称,在Object.class中实现的那样:
getClass().getName() + '@' + Integer.toHexString(hashCode())
当我们直接从对象获取类名时,我们从JVM获取内部名称及其类型,这就是为什么我们有额外的字符,如[和L,它们分别代表Array和ClassName类型。
3. 打印有意义的值
为了能够正确打印结果,我们可以使用java.util包中的一些类。
3.1 Arrays
例如,我们可以使用Arrays类中的两个方法来处理转换。
对于一维数组,我们可以使用toString方法:
Object[] arrayOfObjects = { "John", 2, true };
assertEquals(Arrays.toString(arrayOfObjects), "[John, 2, true]");
对于更多维的数组,我们使用deepToString方法:
Object[] innerArray = { "We", "Are", "Inside" };
Object[] arrayOfObjects = { "John", 2, innerArray };
assertEquals(Arrays.deepToString(arrayOfObjects), "[John, 2, [We, Are, Inside]]");
3.2 Stream
JDK 8中的一项重要新功能是引入了Java Stream,其中包含用于处理元素序列的类:
Object[] arrayOfObjects = { "John", 2, true };
List<String> listOfString = Stream.of(arrayOfObjects)
.map(Object::toString)
.collect(Collectors.toList());
assertEquals(listOfString.toString(), "[John, 2, true]");
首先,我们使用辅助方法of创建了一个流。我们使用map将数组中的所有对象转换为字符串,然后使用collect将其收集到列表中以打印值。
4. 总结
在本教程中,我们了解了如何从数组中打印有意义的信息并避免使用默认的[Ljava.lang.Object。
与往常一样,本教程的完整源代码可在GitHub上获得。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章