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()); } 此方法返回值是类的权限类名+@+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 == -1return "[]"; 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方法,打印的结果就是类的全限类名+@+hashcode,如果想要打印想要的信息,请务必重新toString方法。 ? 谢谢,欢迎指正! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |