zoukankan      html  css  js  c++  java
  • 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 == -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方法,打印的结果就是类的全限类名+@+hashcode,如果想要打印想要的信息,请务必重新toString方法。

    谢谢,欢迎指正!

  • 相关阅读:
    一次郁闷的项目部署经历
    一道面试题的求解
    一次惨痛的教训
    小地方,大郁闷001
    WPF相对资源的访问
    VS2008安装时提示磁盘空间不够的解决办法
    WPFSlider 控件的使用
    关于asp.net大文件上传和进度条实现的学习(1)
    DataList的一次分页困惑
    关于android的XML的解析
  • 原文地址:https://www.cnblogs.com/teach/p/10256745.html
Copyright © 2011-2022 走看看