toString()方法简单分析
Posted teach
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了toString()方法简单分析相关的知识,希望对你有一定的参考价值。
问题描述
今天在使用spotbugs代码走查时发现这样一个问题,如下,
String[] myArray=new String[] {"1","2","3"}; System.out.println(myArray.toString());
一看看上去这个代码没什么问题,打印了数组的值,关键是打印出的结果是什么?结果如下
[Ljava.lang.String;@7852e922
那么问题来了,打印出上面一行东西,这是什么,初衷是要打印数组中的值,起码也是能看懂的呀
暴露的问题
上面的代码,暴露了下面的问题,
1、对toString()方法的不了解;
2、如何打印出能识别的结果;
问题剖析
首先,看下toString()方法,此方法为Object类中定义的方法,一切继承Object类的方法都可以重写toString()方法,下面是Object类中toString()方法的定义,
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
此方法返回值是类的权限类名[email protected]+hashcode码,参照上面的打印的结果,我们可以知道数组类没有重写toString()方法,那么要怎么优雅打印数组中的信息那?
通过查看Arrays类,我们发现Arrays类中虽然没有重新toString()类,但有几个重载的toString方法,例如,toString(boolean[] a)、toString(long[] a)、toString(Object[] a),下面是其中一个方法的源码,
public static String toString(Object[] a) { if (a == null) return "null"; int iMax = a.length - 1; if (iMax == -1) return "[]"; StringBuilder b = new StringBuilder(); b.append(‘[‘); for (int i = 0; ; i++) { b.append(String.valueOf(a[i])); if (i == iMax) return b.append(‘]‘).toString(); b.append(", "); } }
通过分析,源码可以看出是以[]括起来,然后依次打印数组中的元素,那么在打印数组中元素的时候就可以使用Arrays.toString(Object[] a)方法,打印结果如下,
[1, 2, 3]
上面的结果是我们希望见到的,也是我们能理解的,只有这样的才是有意义的。
最后,所有的类均继承自Object类,如果不重新toString方法,打印的结果就是类的全限类名[email protected]+hashcode,如果想要打印想要的信息,请务必重新toString方法。
谢谢,欢迎指正!
以上是关于toString()方法简单分析的主要内容,如果未能解决你的问题,请参考以下文章
Operator '||' cannot be applied to operands of type 'bool?' and 'bool?'(代码片段
Operator '||' cannot be applied to operands of type 'bool?' and 'bool?'(代码片段