java中的 toString()方法实例代码

发布时间 - 2026-01-11 01:06:01    点击率:

前言:

      toString()方法 相信大家都用到过,一般用于以字符串的形式返回对象的相关数据。

  最近项目中需要对一个ArrayList<ArrayList<Integer>> datas  形式的集合处理。

  处理要求把集合数据转换成字符串形式,格式为 :子集合1数据+"#"+子集合2数据+"#"+....+子集合n数据。

  举例: 集合数据 :[[1,2,3],[2,3,5]]  要求转成为 "[1,2,3]#[2,3,5]" 形式的字符串

  第一次是这样处理的:

 ArrayList<ArrayList<Object>> a = new ArrayList<>();  // 打造这样一个数据的集合 [[1,2],[2,3]] 要求 生成字符串 [1,2]#[2,3]
    for (int i = 0; i < 2; i++) { 
      ArrayList<Object> c = new ArrayList<>();
      c.add(i+1);
      c.add(i+2);
      a.add(c);
      //打印单个子集合的字符串形式数据
      Log.i("myinfo",c.toString());
    }
    StringBuilder builder = new StringBuilder();
    builder.append(a.get(0).toString()+"#"+a.get(1).toString());
    //打印该集合的字符串形式数据
    Log.i("myinfo",builder.toString());

  然后看该处理下的Log日志:

05-12 10:29:18.485 9565-9565/com.xxx.aaa I/myinfo: [1, 2]
05-12 10:29:18.485 9565-9565/com.xxx.aaa I/myinfo: [2, 3]
05-12 10:29:18.495 9565-9565/com.xxx.aaa I/myinfo: [1, 2]#[2, 3]

   我们会发现我们想要的是[1,2]#[2,3]形式的字符串,但是结果是[1, 2]#[2, 3]  ,在第二个值开始往后,前面都多了一个空格。

   接下来我们查看 集合下的.toString()方法的源码:

   翻译一下官方解释:

   1、返回这个Collection类(Set和List的父类) 的字符串表现形式

       2、这个表现形式有一个规定的格式,被矩形括号"[]"包含

       3、里面的子元素被“, ”(逗号和空格)分割 (这是重点)

 /**
   * Returns the string representation of this {@code Collection}. The presentation
   * has a specific format. It is enclosed by square brackets ("[]"). Elements
   * are separated by ', ' (comma and space).
   *
   * @return the string representation of this {@code Collection}.
   */
  @Override
  public String toString() {
    if (isEmpty()) {
      return "[]";
    }
    StringBuilder buffer = new StringBuilder(size() * 16);
    buffer.append('[');
    Iterator<?> it = iterator();
    while (it.hasNext()) {
      Object next = it.next();
      if (next != this) {
        buffer.append(next);
      } else {
        buffer.append("(this Collection)");
      }
      if (it.hasNext()) {
        buffer.append(", ");
      }
    }
    buffer.append(']');
    return buffer.toString();
  }

  分析这个Collection下的.toString()方法源码,分为几个部分:

  1、判断集合是不是空(empty),即集合内有没有数据。如果是空值(没有数据)的话,直接返回字符串 "[]"

      2、如果集合不是空值,说明有数据

    ①、迭代取下一个子元素(Object next = it.next()),如果这个子元素是集合本身,添加"(this Collection)"到StringBuffer类的buffer对象中

    ②、如果这个子元素不是集合本身,添加到buffer对象中

    ③、如果这个子元素下面还有子元素,则添加", "到buffer对象中去,用于分割两个相邻子元素

  3、返回StringBuffer.toString()字符串

  由此可见,返回[1, 2]#[2, 3]是官方正确的返回形式,那么对于这个问题,其实在改不了源码的情况下 给得到的字符串后面使用.replaceAll(" ",""); 把字符串中的空格都去掉

  注意:源码中有一段代码:         

   if (next != this) {
        buffer.append(next);
      } else {
        buffer.append("(this Collection)");
      }

  这里可能有些同学看不懂,这里举个例子,还是上面的那个,我们在子集合里面 添加代码 c.add(c); 将集合本身添加到集合中去,看看打印结果

ArrayList<ArrayList<Object>> a = new ArrayList<>();
    for (int i = 0; i < 2; i++) {
      ArrayList<Object> c = new ArrayList<>();
      c.add(i+1);
      c.add(i+2);
      c.add(c);
      //打印单个子集合的字符串形式数据
      Log.i("myinfo",c.toString());
    }

看日志结果中红色部分,是不是看懂了,如果集合中的子元素是集合本身,就将"(this Collection)" 添加到返回集合中

05-12 10:58:00.615 8424-8424/com.maiji.magkarepatient I/myinfo: [1, 2, (this Collection)]
05-12 10:58:00.615 8424-8424/com.maiji.magkarepatient I/myinfo: [2, 3, (this Collection)]  

  至此,上面这个问题解决了,下面我们看下其他类下的.toString()源码。

一、Object

/**
   * Returns a string containing a concise, human-readable description of this
   * object. Subclasses are encouraged to override this method and provide an
   * implementation that takes into account the object's type and data. The
   * default implementation is equivalent to the following expression:
   * <pre>
   *  getClass().getName() + '@' + Integer.toHexString(hashCode())</pre>
   * <p>See <a href="{@docRoot}reference/java/lang/Object.html#writing_toString">Writing a useful
   * {@code toString} method</a>
   * if you intend implementing your own {@code toString} method.
   *
   * @return a printable representation of this object.
   */
  public String toString() {
    return getClass().getName() + '@' + Integer.toHexString(hashCode());
  }

  翻译一下官方解释:

  1、返回一个对于这个Object 简明的、可读的 的字符串

  2、Object类的子类被鼓励去重写这个方法来提供一个实现用于描述对象的类型和数据

  3、默认的执行形式和下面这个例子一致

getClass().getName() + '@' + Integer.toHexString(hashCode())</pre>

  综上:当你的一个类中没有重写.toString()方法的时候就会执行根类Object的这个.toString()方法。

     返回形式:对象的类名+@+哈希值的16进制

getClass().getName()返回对象所属类的类名
hashCode()返回该对象的哈希值
Integer.toHexString(hashCode())将对象的哈希值用16进制表示

 举例:

Object d = new Object();
Log.i("myinfo",d.toString());

05-12 11:23:00.758 17406-17406/com.maiji.magkarepatient I/myinfo: java.lang.Object@e23e786

二、String,StringBuilder,StringBuffer

  三个都是字符串的表现形式,但是有区别的

  ①、String.toString()  , 直接返回本身

  /**
   * Returns this string.
   */
  @Override
  public String toString() {
    return this;
  }

  ②、StringBuilder

   官方解释:以字符串的形式 返回这个builder对象的内容

/**
   * Returns the contents of this builder.
   *
   * @return the string representation of the data in this builder.
   */
  @Override
  public String toString() {
    /* Note: This method is required to workaround a compiler bug
     * in the RI javac (at least in 1.5.0_06) that will generate a
     * reference to the non-public AbstractStringBuilder if we don't
     * override it here.
     */
    return super.toString();
  }

  追溯到super.toString()实现

 /**
   * Returns the current String representation.
   *
   * @return a String containing the characters in this instance.
   */
  @Override
  public String toString() {
    if (count == 0) {
      return "";
    }
    return StringFactory.newStringFromChars(0, count, value);
  }

  ③、StringBuffer

@Override
  public synchronized String toString() {
    return super.toString();
  }

  追溯到super.toString()

/**
   * Returns the current String representation.
   *
   * @return a String containing the characters in this instance.
   */
  @Override
  public String toString() {
    if (count == 0) {
      return "";
    }
    return StringFactory.newStringFromChars(0, count, value);
  }

  综上我们发现,StringBuffer和StringBuilder最终都调用了父级  “AbstractStringBuilder” 中的toString()方法

  但是他们本身的toString()却有所不同,我们由此可以总结

  1、StringBuilder:线程非安全的

     StringBuffer:线程安全的

      2、StringBuilder 处理速度要比 StringBudiler 快的多

  3、单线程大量数据操作,用StringBuilder  ,因为 StringBuilder速度快 , 因为单线程所以不考虑安全性

      多线程大量数据操作,用StringBuffer   ,  因为StringBuffer安全

三、Map

  先看源码:

  可以看到返回的形式是{key1=value1, key2=value2}

  注意   1、当Map集合中没有数据的时候 返回{}

     2、每两个数据之前用", "分割,和Collection一致,一个逗号、一个空格

       3、当键值是集合本身的时候,添加  (this Map)

public String toString() {
    Iterator<Entry<K,V>> i = entrySet().iterator();
    if (! i.hasNext())
      return "{}";
    StringBuilder sb = new StringBuilder();
    sb.append('{');
    for (;;) {
      Entry<K,V> e = i.next();
      K key = e.getKey();
      V value = e.getValue();
      sb.append(key  == this ? "(this Map)" : key);
      sb.append('=');
      sb.append(value == this ? "(this Map)" : value);
      if (! i.hasNext())
        return sb.append('}').toString();
      sb.append(',').append(' ');
    }
  }

  举例:    

 Map<String,String> map = new HashMap<>();
    map.put("keyA","valueA");
    map.put("keyB","valueB");
    map.put("keyC","valueC");
    Log.i("myinfo",map.toString());

打印结果:

05-12 11:41:30.898 4490-4490/com.maiji.magkarepatient I/myinfo: {keyA=valueA, keyB=valueB, keyC=valueC}

以上所述是小编给大家介绍的java中的 toString()方法实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# java  # tostring方法  # 浅析JAVA中toString方法的作用  # java基础之 Arrays.toString()方法详解  # java中的tostring方法的具体用法  # Java toString方法使用超全讲解  # Java自动添加重写的toString方法详解  # java tostring方法重写代码示例  # 浅谈Java编程ToString()方法重写的意义  # Java中枚举的toString()和name()的使用区别小结  # 表现形式  # 这个问题  # 重写  # 中去  # 小编  # 单线程  # 象中  # 追溯到  # 的是  # 都是  # 这是  # 综上  # 几个  # 就会  # 子类  # 在此  # 是这样  # 中有  # 有所不同  # 下一 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  php485函数参数是什么意思_php485各参数详细说明【介绍】  jQuery validate插件功能与用法详解  如何快速生成专业多端适配建站电话?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  如何快速辨别茅台真假?关键步骤解析  如何用虚拟主机快速搭建网站?详细步骤解析  常州企业网站制作公司,全国继续教育网怎么登录?  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  个人摄影网站制作流程,摄影爱好者都去什么网站?  如何在宝塔面板创建新站点?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Java类加载基本过程详细介绍  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  Laravel怎么在Blade中安全地输出原始HTML内容  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  微信小程序 scroll-view组件实现列表页实例代码  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  EditPlus中的正则表达式 实战(2)  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  javascript如何操作浏览器历史记录_怎样实现无刷新导航  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  微信小程序 require机制详解及实例代码  网页设计与网站制作内容,怎样注册网站?  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  Laravel怎么为数据库表字段添加索引以优化查询  ,交易猫的商品怎么发布到网站上去?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何在阿里云虚拟主机上快速搭建个人网站?  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  微信推文制作网站有哪些,怎么做微信推文,急?  浅述节点的创建及常见功能的实现  Laravel怎么使用artisan命令缓存配置和视图  如何正确下载安装西数主机建站助手?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  Python并发异常传播_错误处理解析【教程】  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  如何用VPS主机快速搭建个人网站?  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  高端智能建站公司优选:品牌定制与SEO优化一站式服务  大同网页,大同瑞慈医院官网?  如何在建站之星网店版论坛获取技术支持?  长沙企业网站制作哪家好,长沙水业集团官方网站?  在Oracle关闭情况下如何修改spfile的参数  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】