欢迎光临
我们一直在努力

源码浅谈(一):java中的toString()方法

前言:

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

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

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

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

第一次是这样处理的:

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

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

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

翻译一下官方解释:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

---------------------------------------------------------------------------------------------------------------

 

一、Object

翻译一下官方解释:

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

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

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

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

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

举例:

 

二、String,StringBuilder,StringBuffer

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

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

②、StringBuilder

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

追溯到super.toString()实现

③、StringBuffer

追溯到super.toString()

综上我们发现,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)

举例:

 

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《源码浅谈(一):java中的toString()方法》
文章链接:https://www.456zj.com/20434.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址