问题描述

今天在使用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方法。

谢谢,欢迎指正!

toString()方法简单分析的更多相关文章

  1. java.util.ComparableTimSort中的sort()方法简单分析

    TimSort算法是一种起源于归并排序和插入排序的混合排序算法,设计初衷是为了在真实世界中的各种数据中能够有较好的性能. 该算法最初是由Tim Peters于2002年在Python语言中提出的. T ...

  2. C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析与解决方法

    对于C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析,目前本人分析两种情况,如下: 情况一: 借鉴麒麟.NET ...

  3. 由Java中toString()方法引发的无意识的递归想到的

    先看一段很简单的java代码: toString()/** * @author jeffwong */ public class InfiniteRecursion { public String t ...

  4. JavaScript加密解密7种方法总结分析

    原文地址:http://wenku.baidu.com/view/9048edee9e31433239689357.html 本文一共介绍了七种javascript加密方法: 在做网页时(其实是网页木 ...

  5. java 中 “文件” 和 “流” 的简单分析

    java 中 FIle 和 流的简单分析 File类 简单File 常用方法 创建一个File 对象,检验文件是否存在,若不存在就创建,然后对File的类的这部分操作进行演示,如文件的名称.大小等 / ...

  6. Okhttp对http2的支持简单分析

    在< Okhttp之RealConnection建立链接简单分析>一文中简单的分析了RealConnection的connect方法的作用:打开一个TCP链接或者打开一个隧道链接,在打开t ...

  7. Android实现录屏直播(一)ScreenRecorder的简单分析

    http://blog.csdn.net/zxccxzzxz/article/details/54150396 Android实现录屏直播(一)ScreenRecorder的简单分析 Android实 ...

  8. OkHttp之BridgeInterceptor简单分析

    在< Okhttp源码简单解析(一) >这篇博客简单分析了Okhttp请求的执行流程,通过该篇博客我们知道OkHttp的核心网络请求中内置"拦截器"发挥了重大作用:本篇 ...

  9. lombok的介绍、使用、简单分析和插件

    学习下Lombok. 关于POJO Java面向对象编程中的特性中有封闭性和安全性.封闭性即对类中的域变量进行封闭操作,即用private来修饰他们.如此一来,其他类就不能对该变量访问了.这样,我们就 ...

随机推荐

  1. 一步步入门编写PHP扩展

    1.写在最前 随着互联网飞速发展,lamp架构的流行,php支持的扩展也越来越多,这样直接促进了php的发展. 但是php也有脚本语言不可避免的问题,性能比例如C等编译型语言相差甚多,所以在考虑性能问 ...

  2. [运维笔记] Mysql单库备份脚本

    工作中用到的Mysql单库备份Shell脚本,压缩备份,并在Crontab中添加计划任务,最多保存60天的备份 #!/bin/bash . /etc/profile USERNAME=zabbix P ...

  3. selenium + python自动化测试unittest框架学习(三)webdriver对页面其他控件操作(三)

    1.对话框,下拉框 (1)对话框的有两种,一种是iframe格式的,需要switch_to_iframe()进行定位,现在大部分的对话框是div格式的,这种格式的可以通过层级定位来定位元素,先定位对话 ...

  4. [转]MVP+WCF+三层结构搭建项目框架

    最近,我一直在重构之前做的一个项目,在这个过程中感慨万千.原先的项目是一个运用了WCF的C/S系统,在客户端运用了MVC模式,但MVC的View.Model耦合以及WCF端分布式欠佳等问题让我有了重构 ...

  5. 阿里云阿里免费ssl wap网站在手机微信、手机浏览器无法访问

    图片可以访问,样式无法显示 https://css.cnbuses.com/css/wap/gonggong.css 1,怀疑是开了代理访问. 关闭后还是访问空白. 2.在手机浏览器打开,提示该网站的 ...

  6. 前端css小米导航栏设置及盒子定位居中问题

    1.小米最上部导航栏设置 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  7. Python 学习笔记(十四)Python类(三)

    完善类的内容 示例: #! /usr/bin/env python # coding =utf-8 #通常类名首字母大写 class Person(object): """ ...

  8. mac终端输入python默认打开python3

    *** 1. 终端打开.bash_profile文件 ***open ~/.bash_profile *** 2. .bash_profile文件内容 ***# Setting PATH for Py ...

  9. Docker 常用命令——容器

    1.新建并启动容器 docker run [option] images [command][arg]    #根据镜像新建容器并运行.如果本地没有镜像则从docker hub上拉取. --name ...

  10. 25条提高iOS App性能的技巧和诀窍

    25条提高iOS App性能的技巧和诀窍 当我们开发iOS应用时,好的性能对我们的App来说是很重要的.你的用户也希望如此,但是如果你的app表现的反应迟钝或者很慢也会伤害到你的审核. 然而,由于IO ...