热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

技术分享:String不可变性

本文涉及到的知识点:String不可变性一、交代背景我这边有一个系统,提供一个RPC接口去发送短信。外部调用我的接口需要传入手机号等等参数,

  本文涉及到的知识点:String不可变性

  一、交代背景

  我这边有一个系统,提供一个RPC接口去发送短信。外部调用我的接口需要传入手机号等等参数,我这边负责解析这些参数、做一些业务的处理,然后调用短信渠道商的接口发送短信。

  每当调用完短信渠道商的接口时,我会对这次发送的记录入库(存入MySQL中),同样地短信渠道商会返回发送或失败的回执给我,我也会入库(存入MySQL中)。

  那天,有人来找到我,说某个手机号收不到短信,用户并没有屏蔽短信(欠费、关机)等等一些操作,就是收不到短信。

  于是我就去排查啦,首先我先去DB里边找有没有对应的发送记录,发现这条记录是存在的,而且在DB上看不出来有什么异常。

  所以,这就排除了这个操作在中途被拦截的情况(因为已经入库了,就肯定调用过短信运营商的接口)

  后来就去捞日志,看看调用短信运营商返回的Result对象的信息是什么,然后就去问了一下短信运营商可能出现这种问题的原因是什么。那边回复的是:“如果是部分的手机号出现这种状况,是不是你们的手机号没有trim啊?”

  于是,我又去捞日志,发现手机号后面真的带有一个空格(扎心了,之前一直看不到)。要处理这个问题就变得异常简单了,我只要在入口里边对手机号进行trim就好了。

  二、编写代码

  我这边是支持同一条短信向多个手机号发送,于是手机号我这边用的是HashSet来进行接收。对手机号进行trim我写下了如下的代码:

  

 

  代码很简单,我做的就两步:

  判断是否为null,不为null值则遍历手机号集合

  对每个手机号进行trim上面的代码有问题吗?必须有问题啊,没问题我还写啥。

  下面写个小Demo,我们会发现:在代码的11行上调用trim()方法后,在12行再输出,还是会有空格的情况。

  

https://img.mukewang.com/5d307f730001f6a506930311.jpg

代码示例

 

  2.1 为什么会有这种错觉?

  其实,我们在初学Java的时候,肯定会学到String类。在学习的时候也是明确String是不可变的,但总是有个感觉我们把String对象给改了,为什么?

  

https://img2.mukewang.com/5d307f750001cd8b07000271.jpg

不可变的String

 

  我觉得第一点是这样的:我们操作的往往是可变的对象,对象的某些属性改了,我们就认为已经改了。比如下面的代码:

  

 

  执行完,我们就认为在HashSet里边的Student的名字全改成Java3y了,而实际上也是如此。

  我觉得第二点是这样的:我们平时操作String对象,都是直接把操作后的结果传过去,这看起来就像修改原对象了一样。比如下面类似的代码:

  

 

  

https://img3.mukewang.com/5d307f7900011f6d07140525.jpg

返回一个新的String对象

 

  2.2 怎么改

  现在问题已经知道了,String对象是不可变的,对String对象进行操作,“看似”把原来的String对象改了,实际上是生成了一个新的String对象。

  回到我那个问题,也很好解决,把trim好的手机号设置到HashSet就行了

  


推荐阅读
author-avatar
_妃妃教主
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有