記一次愚蠢的操做--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多篇原創技術文章海量視頻資源精美腦圖面試題長按掃碼可關注獲取

相關文章
相關標籤/搜索