记一次愚蠢的操做--String不可变性

前言

只有光头才能变强。
文本已收录至个人GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3ygit

记录一次在写代码时愚蠢的操做,本文涉及到的知识点:String不可变性程序员

1、交代背景

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

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

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

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

  • 因此,这就排除了这个操做在中途被拦截的状况(由于已经入库了,就确定调用太短信运营商的接口)
    后来就去捞日志,看看调用短信运营商返回的Result对象的信息是什么,而后就去问了一下短信运营商可能出现这种问题的缘由是什么。那边回复的是:“若是是部分的手机号出现这种情况,是否是大家的手机号没有trim啊?”

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

2、编写代码

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

// 说明:Task对象 有个 key属性,这个key属性的类型是HashSet

if (task.getKey() != null && task.getKey().size() > 0) {
    for (String s : task.getKey()) {
        s.trim();
    }
}

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

  • 判断是否为null,不为null值则遍历手机号集合
  • 对每一个手机号进行trim
    上面的代码有问题吗?必须有问题啊,没问题我还写啥。

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

记一次愚蠢的操做--String不可变性
代码示例

2.1 为何会有这种错觉?

其实,咱们在初学Java的时候,确定会学到String类。在学习的时候也是明确String是不可变的,但老是有个感受咱们把String对象给改了,为何?

记一次愚蠢的操做--String不可变性
不可变的String
我以为第一点是这样的:咱们操做的每每是可变的对象,对象的某些属性改了,咱们就认为已经改了。好比下面的代码:

HashSet<Student> students = getStudent();
for (Student s1 : students) {
    s1.setName("Java3y");
}

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

我以为第二点是这样的:咱们平时操做String对象,都是直接把操做后的结果传过去,这看起来就像修改原对象了同样。好比下面相似的代码:

// 去重
String phone = "   137888888888    ";
sendPhone(phone.trim());

// 转成大写后输出
System.out.println(phone.toUpperCase());

// ... 等等

-----

记一次愚蠢的操做--String不可变性
返回一个新的String对象

2.2 怎么改

如今问题已经知道了,String对象是不可变的,对String对象进行操做,“看似”把原来的String对象改了,其实是生成了一个新的String对象。

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

// 说明:Task对象 有个 key属性,这个key属性的类型是HashSet

HashSet<String> hs = new HashSet();
if (task.getKey() != null && task.getKey().size() > 0) {
    for (String s : task.getKey()) {
        hs.add(s.trim());
    }
}
task.setKey(hs);

最后

这个B写了一篇文章来解释本身是怎么“合理“写Bug的,真tm不要脸。

推荐阅读:

  • 大佬准备了一年时间拿到今日头条offer
  • 进程之间究竟有哪些通讯方式?---- 告别死记硬背
  • 什么是列式存储?
  • 硬核干货长文!Hbase来了解一下不?
  • 程序员的快乐就是这么朴素无华且枯燥
  • 互联网/电商/广告常见的术语
  • 拿到一台新的Windows电脑,我会作什么?
  • 在公司作的项目和本身在学校作的有什么区别
    记一次愚蠢的操做--String不可变性

200多篇原创技术文章海量视频资源精美脑图面试题长按扫码可关注获取

相关文章
相关标签/搜索